过期策略
默认情况下,Redis 使用的是惰性删除 + 定期删除的策略
1. 定时删除(非redis)
在设置 Key 过期时间的同时创建定时器,让定时器在 Key 过期时执行删除操作
保证过期数据能被及时删除
耗 CPU,尤其当存在大量非永久 Key 时,对 CPU 影响更严重
2. 惰性删除
Key 过期时不主动删除,获取数据时判断该 Key 是否过期,如果过期直接删除
对 CPU 消耗小
耗内存,如果数据过期但又没有任何操作来获取该数据,哪怕数据已经过期了,但该数据任会一直存在
3. 定期删除
每隔一段时间执行一次删除操作
不如定时删除那么消耗 CPU,也不如惰性删除那么占内存
比定时删除更消耗内存,必惰性删除更消耗 CPU
redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的 key。
**
Redis 默认会每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。
从过期字典中随机 20 个 key;
删除这 20 个 key 中已经过期的 key;
如果过期的 key 比率超过 1/4,那就重复步骤 1;
为什么要采用定期删除+惰性删除2种策略呢?
如果过期就删除。假设redis里放了10万个key,都设置了过期时间,你每隔几百毫秒,就检查10万个key,那redis基本上就死了,cpu负载会很高的,消耗在你的检查过期key上了
但是问题是,定期删除可能会导致很多过期key到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。这就是说,在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。
并不是key到时间就被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下
通过上述两种手段结合起来,保证过期的key一定会被干掉。
所以说用了上述2种策略后,下面这种现象就不难解释了:数据明明都过期了,但是还占有着内存
如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。
Reids6种淘汰策略
noeviction: (默认)不删除策略,
达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。大多数写命令都会导致占用更多的内存
allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
allkeys-random: 所有key通用; 随机删除一部分 key。
volatile-random: 只限于设置了expire的部分; 随机删除一部分 key。
volatile-ttl: 只限于设置了expire的部分; 优先删除剩余时间(time to live,TTL) 短的key。
**
LRU(链表):(1).当缓存中有新数据加入,则插入链表头部.(2).当缓存命中时,则将命中的缓存移动至链表头部.(3).当链表数据满时,则丢弃链表尾部的数据.
LFU:
