Redis 设置响应过期时间主要通过 EXPIRE、PEXPIRE、SETEX 等命令实现,单位为秒或毫秒。缓存自动过期策略配置涉及三种删除策略:定时删除、惰性删除和定期删除。Redis 默认采用惰性删除与定期删除相结合的方式,既避免占用过多 CPU,又防止内存泄露。用户可通过配置 maxmemory 和淘汰策略(如 volatile-lru)来管理内存不足时的行为,确保过期键能被有效清理,维持缓存系统的高效运行。
Redis 键过期策略、内存淘汰策略详解
1 设置带过期时间的 key 代码语言:javascript # 时间复杂度:O(1),最常用方式 expire key seconds # 字符串独有方式 setex(String key,int seconds,String value) 除了 string 独有设置过期时间的方法,其他类型都需要依靠 expire 方法设置时间,若:未设置时间,则缓存永不过期 设置过期时间,但之后又想让缓存永不过期,使用 persist 方法。设置 key 的过期时间。超时后,将会自动删除该 key。在 Redis 的术语中一个 key 的相关超时是 volatile 的。超时后只有对 key 执行 DEL、SET、GETSET 时才会清除。所以,从概念上讲,所有改变 key 而不用新值替换的所有操作都将保持超时不变。例如,使用 INCR 递增 key 的值,执行 LPUSH 将新值推到 list 中或用 HSET 改变 hash 的 field,这些操作都使超时保持不变。使用 PERSIST 命令可以清除超时,使其变成一个永久 key 若 key 被 RENAME 命令修改,相关的超时时间会转移到新 key 若 key 被 RENAME 命令修改,比如原来就存在 Key_A,然后调用 RENAME Key_B Key_A 命令,这时不管原来 Key_A 是永久的还是设为超时的,都会由 Key_B 的有效期状态覆盖 注意,使用非正超时调用 EXPIRE/PEXPIRE 或具有过去时间的 EXPIREAT/PEXPIREAT 将导致 key 被删除而不是过期 (因此,发出的 key 事件将是 del,而不是过期)。1.1 刷新过期时间 对已经有过期时间的 key 执行 EXPIRE 操作,将会更新它的过期时间。有很多应用有这种业务场景,例如记录会话的 session。1.2 Redis 之前的 2.1.3 的差异 在 Redis 版本之前 2.1.3 中,使用更改其值的命令更改具有过期集的密钥具有完全删除 key 的效果。由于现在修复的复制层中存在限制,因此需要此语义。EXPIRE 将返回 0,并且不会更改具有超时集的键的超时。1.3 返回值 1 如果成功设置过期时间。0 如果 key 不存在或者不能设置过期时间。(搜索结果收录于 2026 年 4 月 14 日)
Redis 键过期策略
redis 如何设置键的过期时间?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 时间友好方面,不如"惰性删除" 难点 合理设置删除操作的执行时长 (每次删除执行多长时间) 和执行频率 (每隔多长时间做一次删除)(这个要根据 服务器 运行情况来定了) 注意 : 上边所说的数据库指的是内存数据库,默认情况下每一台(发布时间是 2026 年 3 月 31 日)
《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 字典,保存了数据库的所有键的过期时间,因此也称这个属性为过期字典。过期字典的键是一个指针,指向键空间的某个对象,也就是数据库的某个键;过期字典的值是一个 long 类型的整数,这个整数保存了键所指向的数据库的键的过期时间,是一个毫秒精度的 unix 时间戳。带过期字典的数据库如下图所示:上图中,键出现了两次,但是实际上只会出现一次,过期时间中的键都是指针,指向地址而已。上图那么画仅为了便于展示。因此,pexpireat 命令实际上是给 redisDb 结构的 expires 字典,添加一个键值对,键是指向要设置过期时间的键对象的指针,值是 long 类型的 unix 毫秒时间戳表示过期时间。4、移除过期时间 redis 客户端执行 persist 命令,可以将某个 key 移除过期时间。移除后,再用 ttl 命令查询,会得到 -1 的结果,即 -1 表示的是没有设定过期时间。而具体实现上,也就是将 expires 指向 key 的指针以及其值的内存空间收回即可。redis 在用 ttl 命令查询 expires 字典,查不到时,就返回 -1,表示没有设置过期时间。5、过期键的删除方式(来自 2026 年 4 月 14 日的资料)
Redis 过期策略及实现原理
我们在使用 redis 时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。当我们设置了过期时间,redis 是如何判断是否过期,以及根据什么策略来进行删除的。redis 设置过期时间:expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串独有的方式 注:除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠 expire 方法来设置时间如果没有设置时间,那缓存就是永不过期如果设置了过期时间,之后又想让缓存永不过期,使用 persist key 三种过期策略:定时删除 含义:在设置 key 的过期时间的同时,为该 key 创建一个定时器,让定时器在 key 的过期时间来临时,对 key 进行删除 优点:保证内存被尽快释放 缺点:若过期 key 很多,删除这些 key 会占用很多的 CPU 时间,在 CPU 时间紧张的情况下,CPU 不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些 key 定时器的创建耗时,若为每一个设置过期时间的 key 创建一个定时器 (将会有大量的定时器产生),性能影响严重 懒汉式式删除 含义:key 过期的时候不删除,每次通过 key 获取值的时候去检查是否过期,若过期,则删除,返回 null。优点:删除操作只发生在通过 key 取值的时候发生,而且只删除当前 key,所以对 CPU 时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步 (如果此时还不删除的话,我们就会获取到了已经过期的 key 了) 缺点:若大量的 key 在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露 (无用的垃圾占用了大量的内存) 定期删除 含义:每隔一段时间执行一次删除过期 key 操作 优点:通过限制删除操作的时长和频率,来减少删除操作对 CPU 时间的占用--处理"定时删除"的缺点 定期删除过期 key--处理"懒汉式删除"的缺点 缺点:在内存友好方面,不如"定时删除"(会造成一定的内存占用,但是没有懒汉式那么占用内存) 在 CPU 时间友好方面,不如"懒汉式删除"(会定期的去进行比较和删除操作,cpu 方面不如懒汉式,但是比定时好) 难点:合理设置删除操作的执行时长 (每次删除执行多长时间) 和执行频率 (每隔多长时间做一次删除)(这个要根据服务器运行情况来定了),每次执行时间太长,或者执行频率太高对 cpu 都是一种压力。每次进行定期删除操作执行之后,需要记录遍历循环到了哪个标志位,以便下一次定期时间来时,从上次位置开始进行循环遍历 说明 说明:memcached 只是用了惰性删除,而 redis 同时使用了惰性删除与定期删除,这也是二者的一个不同点 (可以看做是 redis 优于 memcached 的(2023 年 7 月 1 日的资料)
Redis 详解 (十一)------ 过期删除策略和内存淘汰策略
1、设置 Redis 键过期时间 Redis 提供了四个命令来设置过期时间 (生存时间)。①、EXPIRE
FAQ
Redis 设置过期时间的命令有哪些?
主要有 EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT 以及针对字符串的 SETEX 命令。
Redis 默认采用什么过期删除策略?
Redis 默认采用惰性删除与定期删除相结合的策略,以平衡 CPU 使用和内存释放。
如何查看键的剩余生存时间?
可以使用 TTL 命令以秒为单位查看,或使用 PTTL 命令以毫秒为单位查看。