Redis内存回收策略

 

若是使用Redis的时候,不合理使用内存,把什么东西都放在内存里面,又不设置过时时间,就会致使内存的堆积愈来愈大。根据28法则,除了20%的热点数据以外,剩余的80%的非热点或不怎么重要的数据都在占用内存空间,这时就要使用一种淘汰策略来释放一些内存。Redis中提供了多种内存回收策略,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对 象,释放这些对象占用的空间,那么选择淘汰哪些对象呢?
在redis.conf 里面有个配置策略 maxmemory-policy ,它有几个可选值:
redis

noeviction: 默认的策略,即当内存使用达到阈值的时候,全部引发申请内存的命令都会报错;
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 。
适用场景: 若是咱们的应用对缓存的访问都是相对热点数据,就能够选择这个策略;
allkeys-random:随机移除某个key。
适合的场景:若是咱们的应用对于缓存key的访问几率相等,则可使用这个策略。



算法

从已经设置了过时时间的key中去选择
volatile-random:从已设置过时时间的数据集(server.db[i].expires)中任意选择数据淘汰。
volatile-lru:从已设置过时时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过时时间的数据集(server.db[i].expires)中挑选将要过时的数据淘汰;适合场景:这种策略使咱们能够向Redis提示哪些key更适合被淘汰,能够本身控制 。


缓存

那么怎样保证Redis里面的数据都是热点数据?
可使用LRU的淘汰策略,选择最近最少使用的数据所有淘汰掉,剩下的就是常常访问的数据,都是热点数据。
markdown

总结
实际上Redis实现的LRU并非可靠的LRU,也就是名义上咱们使用LRU算法淘汰内存数据,可是实际上被淘汰的键 并不必定是真正的最少使用的数据,这里就要权衡了,若是须要在全部的数据中搜索符合条件的数 据,那么必定会增长系统的开销,Redis是单线程的,因此耗时的操做会谨慎一些。为了在必定成本内实现相对的 LRU,早期的Redis版本是基于采样的LRU,也就是放弃了从全部数据中搜索解,改成采样空间搜索优解。Redis3.0 版本以后,Redis做者对于基于采样的LRU进行了一些优化,目的是在必定的成本范围内让结果更靠近真实的LRU。
dom