Redis 键失效时间主要通过过期字典(expires dict)进行判断,该字典保存了键的过期时间戳(毫秒级 Unix 时间戳)。当访问键时,Redis 会检查当前时间是否超过过期时间戳。键值生命周期管理通过设置过期时间命令(如 EXPIRE、PEXPIRE、SETEX 等)实现,配合惰性删除、定期删除和内存淘汰策略。惰性删除在访问时检查过期,定期删除后台随机抽查,内存淘汰则在内存不足时根据策略(如 LRU、LFU)移除键,从而高效管理内存和数据生命周期。
【Redis 过期策略:如何高效管理键的生命周期】_redis 键生命周期-CSDN 博客
【Redis 过期策略:如何高效管理键的生命周期】 💡 摘要:是否担心 Redis 内存被无用数据占满?是否需要自动清理过期缓存或会话数据?Redis 的键过期策略提供了强大的自动数据清理机制,让你能够精细控制每个键的生命周期。合理使用过期策略不仅可以节省宝贵的内存空间,还能自动处理数据失效逻辑,大大简化应用开发。本文将深入解析 Redis 的键过期机制,从 EXPIRE 命令的使用到底层淘汰算法,从被动删除到主动清理的完整生命周期管理。你会学习到如何为不同业务场景设置合适的过期时间,如何监控和优化内存使用,以及避免常见的陷阱。掌握这些技巧,让你的 Redis 实例始终保持最佳状态!一、Redis 键过期概述 1. 为什么需要键过期?在 Redis 中,内存是宝贵的资源。键过期机制帮助我们:🗑️自动清理:避免手动删除过期数据 💾内存优化:及时释放不再需要的数据 ⏰业务逻辑:实现缓存失效、会话过期等功能 🔄资源回收:防止内存泄漏和无限制增长 2. 过期时间的精度 Redis 过期时间精度为毫秒级,但实际清理精度取决于配置和负载情况。
《Redis 设计与实现》读书笔记 (十二) ——Redis 键的生存时间与过期时间
1、设置方式 在 redis 客户端,可以通过 expire 命令设置某个键的以秒为单位的生存时间 (TTL),也可以用 pexpire 设置以毫秒为单位的时间。setex 命令可以在对字符串对象设置值的时候,同时设置过期时间,但是其只针对字符串对象可以使用。在经过指定时间后,服务器会自动删除生存时间为 0 的键值对。在客户端,还可以通过 expireat 或 pexpireat 命令,设置数据库键的过期时间。这个时间是一个 unix 时间戳,当时间到达该时间时,redis 会删除该键。另外,可以用 ttl 或 pttl 命令,查看键的剩余生存时间。如果键不存在数据库,会返回 -2;键没有过期时间,返回 -1;如果键有过期时间,则用过期时间的 unix 毫秒时间戳,减去当前时间的 unix 毫秒时间戳。2、设置过期时间原理 redis 有四个命令设置过期时间,但是实际上,expire、pexpire、expireat 三个命令都是通过 pexpireat 命令实现的。首先,expire 命令可以转化成 pexpire 命令,只需要将设置的值乘以 1000。接着 pexpire 命令可以转化成 pexpireat 命令,只需要把当前时间的 unix 毫秒时间戳加上过期时间的 unix 毫秒时间戳即可。另外,expireat 命令可以转化成 pexpireat 命令,只需要将设置的值乘以 1000。如下图所示:3、保存过期时间 redisDb 结构的 expire 字典,保存了数据库的所有键的过期时间,因此也称这个属性为过期字典。
Redis 过期策略详解:如何高效管理缓存生命周期_数据库_华为云论坛
redis 作为高性能的键值存储系统,其过期策略是缓存管理的核心功能之一。本文将深入解析 redis 的过期机制,帮助开发者更好地利用这一特性优化应用性能。一,redis 过期策略概述 redis 提供了两种主要的过期策略:被动过期 (惰性删除) 当客户端尝试访问一个键时,redis 会检查该键是否已过期 如果过期则立即删除,返回空值 优点:对 cpu 友好,不会主动消耗资源 缺点:可能导致内存浪费 (过期键未被访问时不会释放) 主动过期 (定期删除) redis 定期随机测试设置了过期时间的键 删除已过期的键 默认每秒运行 10 次 (可配置) 每次检查都会从过期字典中随机抽取 20 个键 二,过期策略的底层实现 redis 使用一个特殊的"过期字典"来存储所有设置了过期时间的键及其过期时间戳。这个数据结构保证了过期检查的高效性:typedef struct redisdb { dict *dict; //键空间 dict *expires; //过期字典 // 其他字段 } redisdb; 复制 三,过期命令使用指南 redis 提供了多种设置过期时间的命令:#设置键值对并指定过期时间 (秒) setex key seconds value #设置键值对并指定过期时间 (毫秒) psetex key milliseconds value #为已存在的键设置过期时间 (秒) expire key seconds #为已存在的键设置过期时间 (毫秒) pexpire key milliseconds #查看键的剩余生存时间 (秒) ttl key #查看键的剩余生存时间 (毫秒) pttl key #移除键的过期时间 persist key 复制 四,最佳实践与性能优化 合理设置过期时间 根据业务特点设置不同的过期策略 热点数据可以设置较长过期时间 临时数据设置较短过期时间 避免大量键同时过期 可能导致 redis 短时间内负载过高 解决方案:为过期时间添加随机偏移量 #设置带有随机偏移量的过期时间 expire_time = 3600 + random.randint( 0 , 300 ) # 1 小时±5 分钟 redis_client.expire( 'key' , expire_time) 复制 监控与调优 使用 info stats 命令监控过期键删除情况 关注 expired_keys 指标了解过期键数量 调整 hz 参数控制主动过期频率 (默认 10) 五,常见问题解答 q:为什么我的键没有在预期时间被删除?a:redis 的过期删除是概率性的,可能存在短暂延迟。对于精确时间要求高的场景,建议结合业务逻辑处理。q:如何清理大量已过期的键?
Redis 键过期策略
1,设置过期时间 expire key time(s)--这是最常用的方式 setex(string key, int seconds, string value)--字符串独有的方式 注意 : 除了 string 独有设置过期时间方法,其他类型都需要依靠 expire 方法来设置时间 如果没有设置时间,那缓存就是永不过期 如果设置了过期时间,之后又想让缓存永不过期,使用 persist key 2,三种过期策略 定时删除 含义:在设置 key 的过期时间的同时,为该 key 创建一个定时器,让定时器在 key 的过期时间来临时,对 key 进行删除 优点:保证内存被尽快释放 缺点:若过期 key 很多,删除这些 key 会占用很多的 cpu 时间,在 cpu 时间紧张的情况下,cpu 不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些 key 定时器的创建耗时,若为每一个设置过期时间的 key 创建一个定时器 (将会有大量的定时器产生),性能影响严重 没人用 惰性删除 含义:key 过期的时候不删除,每次从 数据库 获取 key 的时候去检查是否过期,若过期,则删除,返回 null. 优点:删除操作只发生在从数据库取出 key 的时候发生,而且只删除当前 key,所以对 cpu 时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步 (如果此时还不删除的话,我们就会获取到了已经过期的 key 了) 缺点:若大量的 key 在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露 (无用的垃圾占用了大量的内存) 定期删除 含义:每隔一段时间执行一次删除过期 key 操作 优点:通过限制删除操作的时长和频率,来减少删除操作对 cpu 时间的占用--处理"定时删除"的缺点 定期删除过期 key--处理"惰性删除"的缺点 缺点 在内存友好方面,不如"定时删除" 在 cpu 时间友好方面,不如"惰性删除" 难点 合理设置删除操作的执行时长 (每次删除执行多长时间) 和执行频率 (每隔多长时间做一次删除)(这个要根据 服务器 运行情况来定了) 注意 : 上边所说的数据库指的是内存数据库,默认情况下每一台
FAQ
Q: Redis 如何判断键是否过期?
A: Redis 通过过期字典(expires)存储键的过期时间戳。访问键时,对比当前时间与过期时间戳;后台定期删除策略也会随机抽查过期字典中的键进行比对删除。
Q: 设置了过期时间的键一定会准时删除吗?
A: 不一定。惰性删除只在访问时触发,定期删除是概率性的。如果键未被访问且未被定期删除策略选中,可能会存活超过过期时间,直到内存淘汰或被访问。
Q: 如何移除键的过期时间?
A: 使用 PERSIST 命令可以移除键的过期时间,使其成为永久键。执行成功后,TTL 命令将返回 -1。