【redis内存模型】

一、内存统计命令

info memory

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

【redis内存模型】_第1张图片

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),当内存达到一定量后,根据不同的优先级对内存进行回收。

你可能感兴趣的:(【redis内存模型】)