redis的key超时策略和key淘汰机制(面试题详解)

ChatGPT给出的回答:

Redis中的Key超时策略和Key淘汰机制是为了有效管理内存和控制数据的生命周期。

  1. Key超时策略:Redis可以为每个Key设置过期时间,一旦Key过期,它将自动从Redis中删除。可以使用EXPIRE命令为Key设置过期时间,例如可以使用EXPIRE key seconds命令设置某个Key在指定的秒数后过期。超时策略可以用于缓存失效、会话管理等场景,使得Redis可以自动清理不再使用的数据,释放内存空间。

  2. Key淘汰机制:当Redis的内存达到一定限制时,需要使用淘汰机制来决定哪些Key应该被删除以释放内存。Redis提供了不同的Key淘汰策略:

    • LRU(Least Recently Used):最近最少使用的Key被优先淘汰。
    • LFU(Least Frequently Used):最不经常使用的Key被优先淘汰。
    • Random(随机):随机选择Key进行淘汰。
    • TTL(Time to Live):优先淘汰设置了过期时间且已过期的Key。
      .

    淘汰机制可以通过配置参数来设置,例如可以使用maxmemory参数来限制Redis使用的最大内存,使用maxmemory-policy参数来指定淘汰策略。

    通过合理设置超时策略和淘汰机制,可以在Redis中有效管理内存,控制存储的数据,确保系统的性能和可用性。

详解

Redis过期策略
  • Redis在设置缓存数据时设置了过期时间,到了过期时间数据就失效了,但数据不会自动删除,那Redis是怎么处理这些失效的数据的呢?这个处理逻辑称之为过期策略。
  • Redis使用是惰性删除定期删除两种策略。

Redis的key过期策略
  • 被动方式 - 惰性删除
  • 主动方式 - 定期删除
  • 定时删除(十分消耗CPU资源,所以不用)

惰性删除

惰性删除不是去主动删除,而是在你要获取某个key 的时候,redis会先去检测一下这个key是否已经过期,如果没有过期则返回给你,如果已经过期了,则删除,返回null。

定期删除
  • Redis 默认每秒进行 10 次过期扫描,而是采用了一种简单的贪心策略:

  • 他会去遍历16个库,遍历每一个库,对这个库进行抽样,抽样之后,判断抽样出来的key,是否超过1/4的key是否处于过期状态,如果说,这些抽样出来的key里边的没有超过1/4的key过期,此时他先清理完抽样出来过期的数据之后,再去遍历下一个库

  • 如果说超过了1/4 的key过期了,再次去遍历这个库,再去取判断抽取出来是否超过1/4过期,如此循环。有一些默认的参数,规定说,遍历一个库的时间,最多不能超过多少,遍历所有库的时间最多不能超过多少。定期删除里面的参数都是算法决定的,参数可自己设置。

定时删除

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


Redis淘汰机制

是指Redis的内存占用过多,达到maxmemory 之后,Redis就会采用一定的策略,淘汰掉一部分数据。

Redis6种淘汰机制

1、noeviction:当内存不足以容纳新写入数据时,新写入操作会报错(一般没人用,但是默认是使用这个策略)

2、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(最常用)

3、allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key (一般没人用)

4、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(一般不太合适)

5、volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个

6、key volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

相关推荐
运维行者_4 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev4 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1235 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器5 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天5 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
桌面运维家5 小时前
如何用半缓存云桌面将服务器硬盘容量扩展至本地终端?
运维·服务器·缓存
南墙上的石头6 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画7 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc7 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t8 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb