论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
数据库
›
Mysql
›
Redis进阶 - 朝生暮死之Redis过期计谋
Redis进阶 - 朝生暮死之Redis过期计谋
不到断气不罢休
论坛元老
|
2024-8-9 00:34:58
|
显示全部楼层
|
阅读模式
楼主
主题
1803
|
帖子
1803
|
积分
5409
概述
Redis 是一种常用的内存数据库,其所有的数据布局都可以设置过期时间,时间一到,就会自动删除。你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割。
你还可以进一步站在死神的角度思考,会不会由于同一时间太多的 key 过期,以至于忙不外来。同时由于 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。所有在过期这件事上,Redis 非常小心。
一、Redis 数据过期
1.1 Redis中key的过期时间
通过 EXPIRE key seconds 命令来设置数据的过期时间。返回1表明设置乐成,返回0表明key不存在大概不能乐成设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。
127.0.0.1:6379> SETEX key 5 value
OK
127.0.0.1:6379> ttl s
(integer) 5
127.0.0.1:6379> GET key
"value"
127.0.0.1:6379> GET key ## 5 秒过后
(nil)
复制代码
命令 TTL 用于返回给定键距离过期还有多长时间。
注意:当key被DEL命令删除大概被SET、GETSET命令重置后与之关联的过期时间会被扫除
。
Redis 有四个命令可以设置键的生存时间(可以存活多久)和过期时间(什么时间到期),如下表所示:
命令说明
expire key seconds
以秒为单位设置键的生存时间
pexpire key milliseconds
以毫秒为单位设置键的生存时间
expireat key timestamp
以秒为单位,设置键的过期 UNIX 时间戳
pexpireat key milliseconds-timestamp
以毫秒为单位,设置键的过期 UNIX 时间戳
1.2 基于时间的过期计谋
在Redis中,可以利用EXPIRE和PEXPIRE命令为键设置生存时间,以秒或毫秒为单位。比方:
# 设置多少秒后过期
EXPIRE key seconds
# 设置多少毫秒后过期
PEXPIRE key milliseconds
# 设置 key 过期时间的时间戳(unix timestamp) 以秒计
EXPIREAT key timestamp
# 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
PEXPIREAT key milliseconds-timestamp
复制代码
可以利用TTL命令或PTTL命令来查看键的剩余生存时间(以秒或毫秒为单位)。比方:
# 以秒为单位,返回给定 key 的剩余生存时间
TTL key
# 以毫秒为单位返回 key 的剩余的过期时间
PTTL key
复制代码
可以利用PERSIST命令来取消键的生存时间,使其永久保存。比方:
# 移除key的过期时间,key将保持永久
PERSIST key
复制代码
二、Redis数据过期计谋
Redis的过期计谋主要是通过定时删除、惰性删除和定期删除三种方式来管理键的生命周期。
过期计谋说明定时删除为每个设置了过期时间的键创建一个定时器,一旦过期就立即删除。
但是这种方式可能会消耗大量的CPU资源,因此Redis默认不利用这种计谋。定期删除每隔一段时间随机抽查一些键,删除其中已经过期的键。
这种方式是前两种方式的折衷,联合了定时任务和惰性删除的优点,是Redis默认采用的计谋。惰性删除只有在访问键时,才会查抄键是否过期,过期则删除。
这种方式可以最洪流平地节省CPU资源,但可能会导致大量的空间浪费。
2.1 定时删除
Redis 在设置键的过期时间时,创建一个定时势件,当过期时间到达时,由事件处理器自动实行键的删除操纵。定时删除计谋对内存是最友爱的,由于它包管过期键会在第一时间被删除, 过期键所消耗的内存会立即被开释。但它对 CPU 时间是最不友爱的,由于删除操纵可能会占用大量的 CPU 时间,将 CPU 时间花在删除那些和当前任务无关的过期键上,从而影响缓存的相应时间和吞吐量,这种做法毫无疑问会是低效的,因此Redis默认不利用这种计谋。
2.2 定期删除
Redis 的定期删除计谋是一种均衡的方法,它定时地查抄 Redis 库中的过期数据,采用随机抽样的方法,根据过期数据的比例来调解删除的速度。过期数据的比例是指 Redis 在定期删除计谋中,根据每次随机抽样的键中有多少是过期的来决定是否继续删除。如果过期的键比例超过 1/4,就继续抽样和删除。这样可以根据过期数据的麋集水平来控制删除的频率,制止过多占用 CPU 资源或内存空间。
Redis 会将每个设置了过期时间的 key 存入到一个单独的字典中,默认每秒进行 10 次过期查抄一次数据库。每次查抄数据库并不是遍历过期的所有 key,而是从数据库中随机抽取一定数量的 key 进行过期查抄。接下来,详细说说 Redis 的定期删除的流程。
此时,会有人问“至于为什么不扫描所有的 key?”,这个题目很简朴,Redis 作为一个单线程系统,全面扫描所有键值对可能会大幅度地影响性能。因此,Redis 限定每次过期扫描的最大耗时,这个限定默认是 25ms。如果用户将操纵超时设置得太短,比如 10ms,那么许多连接可能会由于超时而关闭,导致应用出现许多异常。此时,Redis 的慢查询日志可能并没有任何记录,由于慢查询记录的只是命令的处理时间,而不包括等候时间。当大量键值对在同一时刻过期时,Redis 会多次扫描过期字典,直到过期键的比例低于四分之一。这可能会导致短暂的系统卡顿,尤其在并发请求高的情况下,这可能引发所谓的缓存雪崩。
2.3 惰性删除
与定期删除差别,懒惰删除计谋并不会定时地去扫描和删除过期的键,而是在每次访问 key 时,才会判断该key是否已过期。如果过期则扫除,而且删除的目标仅限于当前处理的键;如果没有过期,不做任那里理,然后返回正常的键值对给客户端。如下图所示:
惰性删除对比定期删除而言,可以节省处理器时间,由于只有在键被访问时,Redis 才会去查抄并删除过期的键。这种计谋在许多情况下都能有效地处理过期的键,由于许多过期的键可能永远都不会被访问,因此没有须要花费时间去删除它们。
然而,惰性删除可能会导致过期的键占用内存空间。由于只有在键被访问时,Redis才会删除它,如果一个过期的键不绝没有被访问,那么它就会不绝占用内存空间,这在内存告急的环境下可能会成为一个题目。举个例子, 对于一些按时间点来更新的数据, 比如日志(log), 在某个时间点之后, 对它们的访问就会大大减少, 如果大量的这些过期数据积存在数据库内里, 用户以为它们已经过期了(已经被删除了), 但实际上这些键却没有真正的被删除(内存也没有被开释), 那效果肯定是非常糟糕。
三、结语
Redis 缓存的过期计谋是包管缓存可靠性和性能的关键之一,通过设置键值对缓存、设置过期时间、取消过期时间和查看 Redis 内存利用情况等操纵,可以实现对缓存的控制和管理。需要注意的是,在设置缓存过期时间时,应根据业务场景和数据范例来选择符合的时间。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
不到断气不罢休
论坛元老
这个人很懒什么都没写!
楼主热帖
Spark的一些重要概念
手绘地图深度解析:类型、风格、功能、 ...
从SAP ECC升级到SAP S4HANA, 几个Key P ...
数据库设计员工管理系统
【Redis高手修炼之路】初学Redis——概 ...
MySQL触发器
从API到Agent:万字长文洞悉LangChain ...
【高效学数据库】第一范式、第二范式、 ...
19.HVV溯源
物联网无线数传通信模块设备常见的几种 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
前端开发
云原生
中间件
快速回复
返回顶部
返回列表