过期淘汰策略
Redis给缓存数据设置过期时间有啥用?
因为内存是有限的,如果缓存中数据都一直保存的话,会导致OOM。
惰性删除
客户端访问某个key时,redis会检查该key是否过期,若过期则删除
定期扫描
redis默认每秒执行10次过期扫描,扫描策略如下:
1.从过期字典随机选择20个key
2.删除这20个key中已过期的key
3.如果过期的key比例超过25%,则重复步骤1
Redis内存淘汰策略
当Redis占用内存超出最大限制,可以采用如下策略让Redis淘汰一些数据,腾出空间继续提供读写服务
no-eviction:对可能导致增大内存的命令返回错误,不让写了!
volatile-ttl:在设置了过期时间的key中,选择剩余寿命(TTL)最短的key将其淘汰
volatile-lru:在设置了过期时间的key中,选择最少使用的key将其淘汰
volatile-random:在设置了过期时间的key中,随机选择一些key将其淘汰
allkeys-lru:在所有的key中,选择最少使用的key,将其淘汰
allkeys-random:在所有key中,随机选择一些key淘汰
4.0版本新增两种:
volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
allkeys-lfu:当内存不足以容纳新写入数据时,移除不经常使用的key
LRU算法
维护一个链表,用于顺序存储被访问过得Key。把最新访问过的数据放在表头,即最近访问的key在表头,最少访问的key在表尾
近似LRU
给每个key维护一个时间戳,淘汰时随机采样5个key,从中淘汰调最旧的key,如果还是超出内存限制,则继续随机采样淘汰。
优点:比LRU算法节约内存,但可以取得相当的效果