众所周知Redis之所以性能高是因为数据都存在内存中,内存是很宝贵的,Redis的内存回收机制本质就是处理达到过期时间的key-value,以及当内存到达最大使用值时候触发的内存淘汰策略。
定时过期(主动淘汰):创建一个定时器,当key设置有过期时间,且达到过期时间的时候,由定时器任务立即执行删除操作。
惰性删除(被动淘汰):数据到达过期时间,不做处理,等下次访问该数据时,如果过期就删除,不返回数据,否则正常返回。
定时过期(主动淘汰):创建一个定时器,当key设置有过期时间,且达到过期时间的时候,由定时器任务立即执行删除操作。
Redis采用的是定时删除和惰性删除的机制实现过期键的内存回收。
Redis对于设置了过期时间的key的逐出算法有哪些?
Redis对于全库的key的逐出算法有哪些?
LRU算法和LFU算法:
Reidis 碎片及原因?
内存分配器的分配策略决定操作系统无法按需分配,这是因为内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配,Redis按照固定的大小将空间分配为例如8字节 16字节 32 字节 等等,Redis这么做的目的是减少分配次数,提高性能,比如客户端申请一个20字节的空间,Redis会分配一个32字节的空间,如果后面在追加10个字节的数据,Redis就无需再次分配空间了。而Redis内存碎片的产生也是因为这个策略,同样如客户端申请一个20字节的空间,Redis会分配一个32字节的空间,后续不在增加数据了,就浪费了12字节的空间,这就是内存碎片。
可以使用 info memory 查询内存的使用详细信息,mem_fragmentation_ratio 大于1.5表示内存碎片严重,需要处理了。
如何解决Redis的内存碎片问题?
config set activedefrag yes;
#表示内存碎片的字节数达到 100MB 时,开始清理;
active-defrag-ignore-bytes 100mb;
#表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理
active-defrag-threshold-lower 10;
如有不正确的地方请各位指出纠正。