1、为什么需要内存淘汰?
redis的数据可以分为两种,一种不带过期时间,另一种带有过期时间,到期自动删除。假如redis的内存占用阈值为M,那么不带过期时间的数据太多或者带过期时间的数据没有及时删除,都可能导致内存溢出。
redis的过期删除策略:a、定期删除:redis会对设置了过期时间的数据定期扫描一边,如果发现有过期的,直接删除(定期-100ms 扫描也不是对所有数据全扫一遍,而是采取抽样的方式,抽取一定数量的key检查,如果过期比例超过某个值,继续抽取一定数量的key)
b、惰性删除:当获取某个数据时,发现它已经过期,直接删除
2、内存淘汰策略
1. noeviction:当内存使用超过配置的时候会返回错误,不会删除任何键
2. allkeys-lru:加入键的时候,如果过限,首先通过LRU算法删除最久没有使用的键
3. volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中删除最久没有使用的键
4. allkeys-random:加入键的时候如果过限,从所有key随机删除
5. volatile-random:加入键的时候如果过限,从过期键的集合中随机删除
6. volatile-ttl:从配置了过期时间的键中删除马上就要过期的键
7. volatile-lfu:从所有配置了过期时间的键中删除使用频率最少的键
8. allkeys-lfu:从所有键中删除使用频率最少的键
lru 和 lfu的区别:lru是使用时间维度, lfu主要是加上使用频率维度,因为不一定最近使用的key,使用频率就比其它key高