Redis的过期策略及内存策略
1. Redis键过期策略
当Redis中key到达了设定的过期时间,Redis怎么样删除这些过期的key呢?Redis提供了三种过期策略来删除过期的key,分别是定时策略、惰性策略、定期策略。
Redis同时使用了惰性策略与定期策略来删除过期的key。
1.1 定时策略
每个设置了过期时间的key,都设置一个定时器。当key到达过期时间时,定时器启动,删除过期的key。(相当于给key设置了一个定时炸弹,定时(过期)时间一到,定时炸弹就启动,炸掉该key)。
该策略对内存非常友好,因为key一旦到期,就立即从内存中删除,但是会占用大量的CPU资源去处理过期的key,会导致缓存的qps的吞吐量降低。
1.2 惰性策略
当key过期之后,不会立刻被删除,只有在它被访问的时候,先判断其是否过期,若过期就立刻删除并返回空。(只有当过期的key被访问时,过期的key才被删除)
该策略对内存非常不友好,极端情况下会导致大量过期的key未被删除,占用内存。 相对于定时策略对CPU资源非常友好。
1.3 定期策略
每隔一段时间会扫描一定数量设置了过期时间的key,并删除已过期的key。
该策略是是前俩者的一个折中方案,通过调整扫描的时间间隔和每次扫描的限定耗时,可以让内存与CPU资源达到最优的平衡效果。
2. Redis内存淘汰策略
Redis内存淘汰策略指当缓存内存不足时,通过淘汰旧数据来为新数据提供存储空间选择的策略。
内存淘汰策略分俩类,每类 4 种,总 8 种。第一类策略针对于所有的key,第二类策略针对于设置了过期时间的key。
2.1 第一类内存淘汰策略
该策略针对于Redis中所有的key都起作用。
2.1.1 noeviction
默认策略,不淘汰key,当内存满了之后,新增数据会直接返回错误。
2.1.2 allkey-lru【推荐】
LRU(less recently used),最近最少使用,从抓取的所有key中使用近似LRU算法进行淘汰。
2.1.3 allkey-lfu
LFU(less frequently used),最少使用频率,从抓取的所有的key中使用近似LFU算法进行淘汰。
2.1.4 allkey-random
从抓取的所有key中,随机淘汰一个。
2.2 第二类内存淘汰策略
该策略只针对设置了过期时间的key。
2.2.1 volatile-lru
;LRU(less recently used),最近最少使用,从抓取的所有key(key设置了过期时间)中使用近似LRU算法进行淘汰。
2.2.2 volatile-lfu
LFU (less frequently used),最近最少使用,最近最少使用,从抓取的所有key(key设置了过期时间)中使用近似LFU算法进行淘汰。
2.2.3 volatile-random
从抓取的所有key(key设置了过期时间)中,随机淘汰一个。
2.2.3 volatile-ttl
TTL(time to live)从抓取的所有key(key设置了过期时间)中,选择越早到期的key进行淘汰。