【Redis】关于过期数据清除的一些策略

2023-09-14 21:08:08

这里要讨论的为过期的数据是如何被清除的,也就是网上常常讨论的过期清除策略。

需要注意的是,redis除了会对过期的数据进行淘汰,也可以通过对内存大小进行限制,并对超出内存限制后进行数据淘汰。此时淘汰的数据未必是过期的,只是因为内存达到限制而被淘汰。需要注意一下两者的区别,数据淘汰算法包括LRU、LFU等。

好,回归过期数据清除策略这里。redis的数据清除策略包括2种。惰性清除和定期清除。

惰性清除很简单,redis会在用户访问数据时,如果发现数据是过期的,那么就删除这个数据,并且给用户返回相应的结果。那么redis是如何发现这个数据是过期的呢?我们知道redis默认有16个库,0~15号库,每一个库对应源码中的一个db结构体,db中有一个dict类型成员变量expire,dict,即字典,也就是哈希表,是redis底层数据结构中的一种,expire哈希表中存储的键值对,key为键,value为其对应的过期时间,expire中存储了该库中所有键的过期时间。

那么定期清除呢?我们先贴上一段redis配置文件中的文字。

# Redis reclaims expired keys in two ways: upon access when those keys are
# found to be expired, and also in background, in what is called the
# "active expire key". The key space is slowly and interactively scanned
# looking for expired keys to reclaim, so that it is possible to free memory
# of keys that are expired and will never be accessed again in a short time.
#
(redis通过2种方法清除过期键:在操作时发现这些key是过期的,还有也是
通过后台清除的,被称作'定期清除key'。key空间被缓慢的、交互式的清除
过期键,所以它可能会清除过期的key来释放内存,并且短时间不会被再次
访问)

# The default effort of the expire cycle will try to avoid having more than
# ten percent of expired keys still in memory, and will try to avoid consuming
# more than 25% of total memory and to add latency to the system. However
# it is possible to increase the expire "effort" that is normally set to
# "1", to a greater value, up to the value "10". At its maximum value the
# system will use more CPU, longer cycles (and technically may introduce
# more latency), and will tolerate less already expired keys still present
# in the system. It's a tradeoff between memory, CPU and latency.
#
(清除循环作为一种默认的尝试,会尝试避免在内存中存在超过10%的过期
Key,并且避免(过期key占用的内存)超过总内存的25%,最终将内存归还系
统。它可以增加这种清除的尝试,通常它会被设置为1,到一个更大的值,
最大可以达到10。它的最大值意味着系统会使用更的的cpu资源,更久的循
环时间(理论上可能会导致延迟),并且容忍更少的现在存在于系统中的过期
的key。它是一种在内存、CPU、延迟之间的一种平衡和折衷)
# active-expire-effort 1

也就是说redis定期清除会主动的进行清除。active-expire-effort控制了每次循环的时间有多长。清除达标的条件为避免在内存中存在超过10%的过期Key,并且避免(过期key占用的内存)超过总内存的25%。不达标的话会继续循环清除,直到达标为止。

另外一个参数hz控制了诸如清除循环、关闭超时客户端等后台任务的频率。综合控制了定期清除的行为。
hz相关注释如下:

# Redis calls an internal function to perform many background tasks, like
# closing connections of clients in timeout, purging expired keys that are
# never requested, and so forth.
#
# Not all tasks are performed with the same frequency, but Redis checks for
# tasks to perform according to the specified "hz" value.
#
# By default "hz" is set to 10. Raising the value will use more CPU when
# Redis is idle, but at the same time will make Redis more responsive when
# there are many keys expiring at the same time, and timeouts may be
# handled with more precision.
#
# The range is between 1 and 500, however a value over 100 is usually not
# a good idea. Most users should use the default of 10 and raise this up to
# 100 only in environments where very low latency is required.
hz 10

参考文章:
[1],Redis(6)删除策略(定时删除、惰性删除、定期删除)和数据逐出策略

更多推荐

Learn Prompt-经验法则

还记得我们在“基础用法”当中提到的三个经验法则吗?尝试提示的多种表述以获得最佳结果使用清晰简短的提示,避免不必要的词语减少不精确的描述现在经过了几页的学习,我认为是时候引入一些新的原则了。3.一个话题对应一个chat​ChatGPT是一个聊天机器人,在生成过程中,它会参考以前的聊天历史,同一对话中出现不同主题会影响下游

ChatGPT Prompting开发实战(九)

一、什么是推理式的prompt开发有时候需要针对一些产品的评论文本进行分析,常见的做法如对每段评论所表达的情感倾向进行推理判断,识别用户对这个产品的使用体验是否满意,那么可以编写相关的prompt来做这样的推理分析。另外,针对不同的文本内容,也可以根据给出的主题来让模型判断一段内容属于什么样的主题。接下来会给出具体示例

数组和指针笔试题解析之【数组】

目录前言:1.一维数组:2.字符数组:2.1题型一:2.2题型二:2.3题型三:3.二维数组:前言:1.数组名的意义:sizeof(数组名):这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。&数组名:这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。2.地址在内存中

TCP详解之滑动窗口

TCP详解之滑动窗口引入窗口概念的原因我们都知道TCP是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了,再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。如果你说完一句话,我在处理其他事情,没有及时回复你,那你不是要干等着我做完其他事情后,我回复你,你才能说

Linux--信号

对于linux来说,信号是软中断。许多重要的程序都需要处理信号。信号,为linux提供了一种处理异步事件的方法。比如,终端用户输入了ctrl+c来中断程序,会通过信号机制停止一个程序。一、信号概述:1、信号的名字和编号:每个信号都有一个名字和编号,名字都以SIG开头。信号定义在signal.h,头文件中,信号名都定义为

java微服务项目整合skywalking链路追踪框架

skywalking官网网址:ApacheSkyWalking目录1、安装skywalking2、微服务接入skywalking3、skywalking数据持久化1、安装skywalking下载skywalking,本篇文章使用的skywalking版本是8.5.0Indexof/dist/skywalkinghttp

阿里云国际站服务器设置自动开关机的攻略

关于需求在特定时间段内主动发动服务器的用户来说非常有用,比如在夜间或周末主动封闭服务器以节约资源。阿里云服务器主动开关机设置方法如下:1.登录阿里云操控台,进入云服务器ECS实例办理页面。2.在实例列表中找到需求设置主动开关机的服务器,点击“办理”按钮。3.在弹出的办理页面中,找到“主动发动”选项,点击“修改”。4.在

阿里云国际站云服务器数据备份方法有哪些?

阿里云国际站云服务器是一种根据云计算技术的虚拟服务器,它能够经过互联网提供计算资源和服务。在运用云服务器的过程中,数据备份是非常重要的一个环节。本文将介绍云服务器数据备份的办法,包含手动备份、主动备份和数据同步。一、手动备份手动备份是将数据复制到另一台服务器或外部存储设备的过程。这种办法适用于数据量较小的场景,能够手动

如何在微信上制作自己的小程序卖东西

在当今的数字化时代,微信小程序已成为电商行业的重要平台。本文将详细解析电商微信小程序的制作流程,帮助你了解从零到上线的过程。一、前期准备1.确定商城定位和目标群体:在制作电商微信小程序前,你需要明确商城的定位,如销售什么产品、面向哪些用户群体等。同时,了解目标群体的需求和习惯,以便进行针对性设计。二、制作流程1.登录乔

基于微信小程序的个人健康管理系统的设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

文章目录问题描述功能展示技术细节小结问题描述本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。功能展示提示:这里可以添加技术名词解释技术细节直接上代码usingUnityEngine;publicclassCameraController:MonoBehaviour{publ

热文推荐