删除策略
定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作
定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键
淘汰策略
6 种数据淘汰策略
-
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选 最近最少使用的数据淘汰
-
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选 将要过期的数据淘汰
-
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
-
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘 汰
-
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
-
no-enviction(驱逐):禁止驱逐数据
Redis 4.0 后新增2种内存淘汰策略
volatile-lfu(Redis 4.0 后新增的内存淘汰策略):从已设置过期时间的数据集,挑选最近最少使用的键值
allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值
LRU算法
传统LRU
基于最后一次访问时间淘汰最久未被使用的元素
传统 LRU 算法的实现是基于「链表」结构,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,只需要删除链表尾部的元素即可,因为链表尾部的元素就代表最久未被使用的元素
存在问题:
-
需要用链表管理所有的缓存数据,这会带来额外的空间开销;
-
当有数据被访问时,需要在链表上把该数据移动到头端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能
Redis如何实现LRU
Redis 实现的是一种近似 LRU 算法,目的是为了更好的节约内存,它的实现方式是在 Redis 的对象结构体中添加一个额外的字段lru,用于记录此数据的最后一次访问时间。
当 Redis 进行内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 (此值可配置)个值,然后淘汰最久没有使用的那个
优点:
-
不用为所有的数据维护一个大链表,节省了空间占用;
-
不用在每次数据访问时都移动链表项,提升了缓存的性能
存在问题:
无法解决缓存污染问题,比如应用一次读取了大量的数据,而这些数据只会被读取这一次,那么这些数据会留存在 Redis 缓存中很长一段时间,造成缓存污染
LFU算法
根据数据访问次数来淘汰最少被使用的数据的
核心思想是如果数据过去被访问多次,将来被访问的频率也更高
Redis如何实现LFU
实现方式是在 Redis 的对象结构体中添加一个额外的字段lru,用于记录此数据的访问次数
对比删除策略
Redis 使用的过期删除策略是「惰性删除+定期删除」,删除的对象是已过期的 key
内存淘汰策略是解决内存使用过大的问题
标签:策略,删除,过期,Redis,链表,淘汰,数据 From: https://www.cnblogs.com/yogayao/p/17466608.html