学无先后,达者为师

网站首页 编程语言 正文

Redis 数据删除策略

作者:Ran959 更新时间: 2022-09-05 编程语言

1. 常见的删除策略

常见的删除策略有以下3种:

  • 定时删除

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。

  • 惰性删除

放任过期键不管,每次从键空间中获取键时,检查该键是否过期,如果过期,就删除该键,如果没有过期,就返回该键。

  • 定期删除

每隔一段时间,程序对数据库进行一次检查,删除里面的过期键,至于要删除哪些数据库的哪些过期键,则由算法决定。

其中定时删除和定期删除为主动删除策略,惰性删除为被动删除策略。

1.1 定时删除策略

定时删除策略通过使用定时器,定时删除策略可以保证过期键尽可能快地被删除,并释放过期键占用的内存。

因此,定时删除策略的优缺点如下所示:

  • 优点:对内存非常友好
  • 缺点:对CPU时间非常不友好

举个例子,如果有大量的命令请求等待服务器处理,并且服务器当前不缺少内存,如果服务器将大量的CPU时间用来删除过期键,那么服务器的响应时间和吞吐量就会受到影响。

也就是说,如果服务器创建大量的定时器,服务器处理命令请求的性能就会降低,因此Redis目前并没有使用定时删除策略。

1.2 惰性删除策略

惰性删除策略只会在获取键时才对键进行过期检查,不会在删除其它无关的过期键花费过多的CPU时间。

因此,惰性删除策略的优缺点如下所示:

  • 优点:对CPU时间非常友好
  • 缺点:对内存非常不友好

举个例子,如果数据库有很多的过期键,而这些过期键又恰好一直没有被访问到,那这些过期键就会一直占用着宝贵的内存资源,造成资源浪费。

1.3 定期删除策略

定期删除策略是定时删除策略和惰性删除策略的一种整合折中方案。

定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,同时,通过定期删除过期键,也有效地减少了因为过期键而带来的内存浪费。

2. Redis使用的过期键删除策略

Redis服务器使用的是惰性删除策略和定期删除策略。(逐出策略)
​Redis使用内存存储数据,在执行每一天命令前,都会调用freeMemorylfNeeded()检测内存释放充足,如果内存不满足要加入数据的最低要求,redis会临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。

2.1 惰性删除策略的实现

过期键的惰性删除策略由expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:

  • 如果输入键已经过期,那么将输入键从数据库中删除
  • 如果输入键未过期,那么不做任何处理

以上描述可以使用如下流程图表示:

2.2 定期删除策略的实现

过期键的定期删除策略由activeExpireCycle函数实现,每当Redis服务器的周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。

原文链接:https://blog.csdn.net/weixin_67588007/article/details/126455553

栏目分类
最近更新