一、Redis缓存过期策略
物理内存达到上限后,像磁盘空间申请虚拟内存(硬盘与内存的swap),甚至崩溃。
内存与硬盘交换 (swap) 虚拟内存,频繁I0 性能急剧下降,会造成redis内存急剧下降;
一般设置物理内存的3/4,在redis.conf中
maxmemory 1024mb
二、过期时间
2.1 数据结构原理
声明数据expires来存储过期时间,redis使用c语言开发,dict是字典,存储key-value结构,类似于map
1、dict 用来维护一个Redis 数据库中包含的所有 Key-Value 键值对。
2、expires则用于维护一个 Redis 数据库中设置了失效时间的键(即key与失效时间的映射)。
3、执行过程:当我们使用 expire命令设置一个key的失效时间时,Redis 首先到dict这个字典表中查找要设置的key是否存在,如果存在就将这个key和失效时间添加到expires这个字典表,当我们使用 setex命令向系统插入数据时,Redis 首先将 Key 和 Value 添加到dict这个字典表中,然后将Key和失效时间添加到expires这个字典表中。
4、设置了失效时间的key和具体的失效时间全部都维护在expires这个字典表中。
2.2 设置超时时间
设置超时时间:
set name:2 111 PX 3000
三、过期key的删除策略
3.1 惰性删除
在key被访问时如果发现它已经失效,那么就删除它,调用expirelfNeeded函数,该函数的意义是: 读取数据之前先检查一下它有没有失效,如果失效了就删除它。
3.2 主动删除
3.2.1 删除策略介绍
触发时机:当内存超过maxmemory限定时,触发主动清理策略,该策略由启动参数的配置决定。
策略种类:主动删除策略LRU,LFU,random,ttl,noenviction。
在redis.conf文件中可以配置主动删除策略,默认是no-enviction (不删除)
maxmemory-policy alTkeys-Tru
3.2.2 LRU
LRU(Least recently used)最近最少使用(类似java的linkedHashMap),删除不经常被访问的数据。最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:
1.新数据插入到链表头部;
2.每当缓存命中 (即缓存数据被访问) ,则将数据移到链表头部
3.当链表满的时候,将链表尾部的数据丢弃。
3.2.3 LFU
从已设置过期时间的数据集挑选使用频率最低的数据淘汰。
3.2.4 ttl
从已设置过期时间的数据集中挑选将要过期的数据淘汰。
3.2.5 volatile-random
从已设置过期时间的数据集中任意选择数据淘汰。
3.2.6 noenviction
Redis 的默认策略。在内存超过阀值后,Redis 不做任何清理工作,然后对所有写操作返回错误,但对读请求正常处理。
3.2.7 可参考连接
面试官,请不要再问我 Redis 的淘汰策略了!_杨同学technotes的博客-CSDN博客
四、 渐进式 rehash
为了避免 rehash 在数据迁移过程中,因拷贝数据的耗时,影响 Redis 性能的情况,所以 Redis 采用了渐进式 rehash,也就是将数据的迁移的工作不再是一次性迁移完成,而是分多次迁移。步骤如下:
1、给「哈希表 2」 分配空间;
2、在 rehash 进行期间,每次哈希表元素进行新增、删除、查找或者更新操作时,Redis 除了会执行对应的操作之外,还顺序将「哈希表 1 」索引位置上的所有 key-value 迁移到「哈希表 2」 上;
3、随着处理客户端发起的哈希表操作请求数量越多,最终在某个时间点会把「哈希表 1 」的所有 key-value 迁移到「哈希表 2」,从而完成 rehash 操作。
4、在进行渐进式 rehash 的过程中,会有两个哈希表,所以在渐进式 rehash 进行期间,哈希表元素的删除、查找、更新等操作都会在这两个哈希表进行。
比如,查找一个 key 的值的话,先会在「哈希表 1」 里面进行查找,没找到,会继续到[哈希表 2 ]进行找到。文章来源:https://www.toymoban.com/news/detail-648428.html
另外,在渐进式 rehash 进行期间,新增一个 key-value 时,会被保存到「哈希表 2 」里面,而**「哈希表 1」 则不再进行任何添加操作**,这样保证了「哈希表 1 」的 key-value 数量只会减少,随着 rehash 操作的完成,最终「哈希表 1 」就会变成空表。文章来源地址https://www.toymoban.com/news/detail-648428.html
到了这里,关于Redis 缓存过期及删除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!