文档章节

Redis 内存优化

learn_more
 learn_more
发布于 2017/09/12 15:55
字数 1432
阅读 33
收藏 1
点赞 0
评论 0

 

1、Redis内存组成

1)自身内存,(没有任何存储的时候,rss 内存)通常在3M左右,忽略不计

2)对象内存,即用户的数据存储,主要包括 keys+values , 所以说键的长度也是个因素

3)缓冲内存,输入输出缓冲区,AOF 缓冲区,复制积压缓冲,输入输出是重点考虑因素

4)内存碎片,used_memory_rss_human - used_memory_human 就是内存碎片

 

2、info memory

used_memory_human:644.96K // Redis 分配器分配的存储总量,没有包括碎片部分

used_memory_rss_human:2.54M // OS 角度看Redis所占用的存储总量,包括碎片部分

total_system_memory_human:1.49G // OS 总内存

used_memory_lua_human:25.00K // Lua 运行内存

maxmemory_human:1.96M // 设置的最大内存

maxmemory_policy:volatile-lru // 内存最大时采取的策略机制来删除键

mem_allocator:jemalloc-4.0.3 // 内存分配器,使用 jemalloc 是很不错的

mem_fragmentation_ratio:1.34 // used_memory_rss_human/used_memory_human

 

3、内存碎片

内存碎片产生的主要原因是内存分配器 jemalloc ,因为他们分配内存都是采用固定范围大小的存储空间,比如一个只需要 2.01M 对象,可能就会被分配空间为 4 M,因为 2 M 放不下。

当然另外的原因是,很多对象在修改的时候(比如字符串追加),Redis会为其分配更多的空间,这个时候有些空间也是浪费的,这个和Java的List Map分配差不多。

还有大量的键值定时过期,而这些过期的键又没有得到充分的释放回收,所以也会导致空间浪费。

内存碎片比例计算: mem_fragmentation_ratio

如果大于1,说明有内存碎片存在,如果非常大,那么应该适当重启程序来释放碎片

如果小于1,说明Redis在使用 SWAP , 内存与磁盘数据交换,这个很好性能,看看内存是否充足

 

 

4、Fork 内存消耗

无论是AOF重写还是RDB备份,都会fork一个子进程出来进行操作,那么这个操作所耗费的内存就叫做子进程内存消耗。

对于Fork操作具体是这样的,子进程和父进程同时共享物理内存,如果这个时候父进程还有写操作,那么子进程就会把写操作的那部分内存拷贝一份出来,那么这部分内存就是多出来要耗费的内存,Linux 用来 copy_on_write。可以查看日志,XXX memory used by copy-on-write

因此假如在Fork时没有写操作,那么内存消耗公式为:子进程+父进程 = 父进程 = Redis总内存

如果Fork时有写操作,那么内存消耗就是: 子进程复制那部分+父进程 = Redis总内存

所以得出的结论是Fork操作时总内存耗费并不是父进程的两倍,而是大于等于父进程

这里复制的时候为了避免过多的复制内存页,需要关闭OS的HugePage,因为开启他时默认复制需要 2 MB,但是关闭时复制只要 4 KB,足足差了 512 倍。

> echo never > /sys/kernel/mm/transparent_hugepage/enabled

> sysctl vm.overcommit_memory = 1 // 防止内存不足时而fork失败

 

5、设置内存上限

>config set maxmeory 1024

>config set maxmemory-policy XXX

设置最大内存,以及达到最大内存时采取的措施,最大内存时很有必要设置的,因为这个可以防止系统内存耗尽而宕机;如果达到最大内存时Redis应该采用何种策略去对Redis空间释放呢?也就是策略配置,默认就直接抛出异常。

其实通过动态设置内存最大值可以进行Redis瘦身,不过这种方式会造成一定的阻塞,而且无论使用何种策略来瘦身都试很好性能的,Redis在查找满足条件的键和删除这些键时有点性能损耗。

 

6、内存回收

1)定时任务删除,每秒运行10次查找过期需删除的键。

2)惰性删除,使用这个键的时候,先判断这个键是否过期,如果过期则删除,这其实影响到了 exist 命令的效率,但是他提高了Redis的整体性能,因为总是使用定时去删除在大量Key同时过期时就会出现大量的删除操作而阻塞整个Redis。

 

7、内存空间节省

因为Redis所耗费的空间都多是在对象内存,那么如何减少对象内存的空间就是首要任务。

Redis的五大数据类型都是通过 RedisObject 来封装的,这个结构体里面存储了基本的

1)type // 数据类型

2)encoding // 内部编码

3)refcount // 引用次数(共享对象,对于 1-9999 的整型使用共享)

4)lru // 最近使用时间

5)*ptr // 具体数据指针

-- 相关命令查看引用数量,编码类型,以及数据结构类型

>set str 1

> object refcount str

(integer) 2147483647

> object encoding str

"int"

> type str

string

 

8、发现大对象 redis-cli --bigkeys

找出5种数据结构中最大的对象,因为对象的大小和时间复杂度有直接关系,所以减小对象和废弃高复杂度的算法是一种很直接的方式。

 

注意:对于具体数据结构的编码优化就暂时不列了,因为很多内容,目前最重要的是如何发现阻塞的问题,然后解决他。

 

 

© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 90
博文 240
码字总数 210196
作品 0
深圳
程序员
Redis研究-1.简单动态字符串

我们知道,在C字符串中,底层的实现是使用c字符数组来实现的,但是在高性能以及内存安全方面,使用底层的c字符串是满足不了的,举个简单的例子,如果你使用strcat(s,s1)函数,如果在操作之前...

会飞的杨先生 ⋅ 2015/08/24 ⋅ 7

Redis 作者详谈2.4 版本改进

本文内容来源于Redis作者@antirez 的博文,由NoSQLFan进行翻译。在文中他首先解释了由于Redis集群可能在较长一段时间内还处理开发阶段,为了避免稳定版本由于这一原因被无限延 后,于是从2.2...

红薯 ⋅ 2011/07/31 ⋅ 0

Redis 作者详谈 2.4 版本改进

由于Redis集群可能在较长一段时间内还处理开发阶段,为了避免稳定版本由于这一原因被无限延后,于是从2.2版本fork出了一个2.4分支,这一分支目前进行了一些新的优化改进及bug修复,如果没有严...

红薯 ⋅ 2011/10/16 ⋅ 1

Redis单机系列文章--1.Redis单机的安装和配置(含视频)

转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426 一、Redis单机下载、编译、安装: cd /opt/softwget http://download.redis.io/releases/redis-3.0.4.tar.gztar xzf redis-3.0.4......

付磊-起扬 ⋅ 2015/09/16 ⋅ 0

Memcache-eAccelerator-APC-Xcache-Redis五种php缓存加速器特点

一、说说Memcached优化方案 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据...

杨太化 ⋅ 2015/10/14 ⋅ 0

节约内存:Instagram的Redis实践

Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Instagram团队如何使...

天天顺利 ⋅ 2015/06/13 ⋅ 0

Redis资料大全

1.Redis是什么? 十五分钟介绍 Redis数据结构 Redis系统性介绍 一个很棒的Redis介绍PPT 强烈推荐!非同一般的Redis介绍 Redis之七种武器 锋利的Redis redis 适用场景与实现 【翻译】Redis协议...

蓝狐乐队 ⋅ 2014/05/25 ⋅ 3

Redis集群性能问题深度分析

Redis集群性能问题深度分析 参考 Redis开发与运维 https://redis.io/ http://www.redis.cn/ https://github.com/antirez/redis https://github.com/sohutv/cachecloud 源起 优化之路永无止境......

minminmsn ⋅ 2017/11/14 ⋅ 0

Redis内存使用优化与存储

Redis内存使用优化与存储:上一篇Redis文章对其适用场景与特点进行了一个概括的分析,本文将对Redis的常见数据类型的使用场景以及在内存优化方面和性能优化方面做一些详细的分析。 Redis常用数...

oldgril ⋅ 2017/03/01 ⋅ 0

Redis设计思路学习与总结

版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qcloud.com/community 宋增宽,腾讯工程师,16年...

偶素浅小浅 ⋅ 2016/12/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 47分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部