redis是一种内存级别的数据库,所有数据均存放在内存中。redis中数据可分为具有时效性的数据、永久有效的数据、已经 过期的数据或被删除的数据或未定义的数据。
我们可以通过redis的TTL指令查询数据的状态:
. XX: 具有时效性的数据
. -1: 永久有效的数据
. -2: 已经过期的数据 或 被删除的数据 或未定义的数据
实际上Redis的删除操作也需要占用redis服务器的性能。如果redis正在高负载的工作进行删除数据,那么就会发生上图可怕的情况。正是基于如此,redis才需要多种删除策略,相互配合实现redis的过期数据删除。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在创建数据时同时创建一个定时器,当key设置有过期时间,且过期时间达到时,由定时器任务立即执行对key的删除操作
优点:节约内存,到时就删除,快速释放掉不必要的内存占用
缺点:CPU压力很大。频繁的删除任务会占用CPU的性能,会影响Redis服务器响应时间和指令吞吐量
数据到达过期时间,不做处理。没错就是不理你,等下次再次访问的时候,就直接删除干掉。
优点:节约CPU性能
缺点: 内存压力大,出现长期占用内存的数据
定时删除和惰性删除都比较极端,而定期删除就是比较折中的方案。
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。
定期删除过程:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
redis启动服务器初始化时,读取配置server.hz的值,默认值为10
每秒执行server.hz次serverCron( ) ---> databaseCron( ) -----> activeExpireCycle( )
activeExpireCycle( )对每个数据分区进行逐一检测,每次执行250ms/server.hz
对数据分区检测时,随机挑选W个key检测:
数据分区中的过期数据会被删除
如果一轮删除过期数据的数量>W*25%,循环该过程
如果一轮删除的过期数据数量<=W*25%, 检查下一个数据分区
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
定期删除的特点
特点1:CPU性能占用设置有峰值,检测频度可自定义设置
特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
redis是内存级的数据库,当redis不断存储数据,数据满了导致内存不足,如果再次储存数据,怎么办呢?这就用到了逐出算法。redis要临时删除一些数据为当前指令清理内存空间,清理数据的策略叫做逐出算法。
逐出算法的八大策略
对于易失数据:
volatile-lru :挑选最近最少使用的数据淘汰
volatile-lfu :挑选最近使用次数最少的数据淘汰
volatile-ttl :挑选将要过起的数据淘汰
voatile-random: 任意选择数据淘汰
检测全库数据
allkeys-lru :挑选最近使用最少的数据淘汰
allkeys-lfu :挑选最近使用次数最少的数据淘汰
allkeys-random: 任意选择数据淘汰
放弃数据驱逐
no-enviction 放弃驱逐