一、内存统计命令
info memory
该命令会输出redis的相关信息,包括内存使用情况,cpu等数据

used_memory: redis内存分配器分配的内存情况,主要是数据占用的存储,单位类型是字节,
used_memory-rss: redis进程占用操作系统内存的大小,
men_fragmentation_ratio : 内存碎片比例,数值越大碎片越多,当碎片比较多的话,可以采用重启的方式(debug reload)使数据从排。正常标准是1.03
men_allcocator: 内存分配器,默认使用的时jemalloc,该分配器在减少内存碎片上处理的比较好
二、内存划分
数据
像redis中存储数据,通过对数据进行一定的包装进行存储,比如redisobject,sds
redis进程占用的内存
缓存内存
比如复制积压缓冲区,客户端缓冲区,aof缓冲区
内存碎片
当清理数据,但是redis缺无法释放数据所占有的内存,导致该内存无法被redis使用,则就会出现内存碎片
三、数据存储的细节
当向redis中存储数据的时候,首先dictEntry对象会存储数据的具体存放位置,相当于指针。redisobject具体存储键值对,该对象内部存储数据其实是用sds进行存储。
SDS
sds被称为动态字符串
struct sdshdr {
int len; //已经占用的长度
int free; //剩余的长度
char buf[];
};
四、优化内存方法
1.使用jemalloc内存分配器
2.使用字符串整型
3.关注内存碎片
内存碎片率是一个重要的参数,对redis 内存的优化有重要意义。
如果内存碎片率过高(jemalloc在1.03左右比较正常),说明内存碎片多,内存浪费严重;这时便可以考虑重启redis服务,在内存中对数据进行重排,减少内存碎片。
如果内存碎片率小于1,说明redis内存不足,部分数据使用了虚拟内存(即swap);由于虚拟内存的存取速度比物理内存差很多(2-3个数量级),此时redis的访问速度可能会变得很慢。因此必须设法增大物理内存(可以增加服务器节点数量,或提高单机内存),或减少redis中的数据。
要减少redis中的数据,除了选用合适的数据类型、利用共享对象等,还有一点是要设置合理的数据回收策略(maxmemory-policy),当内存达到一定量后,根据不同的优先级对内存进行回收。
网友评论