首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redis-数据过期(TTL)

Redis-数据过期(TTL)

作者头像
运维小路
发布2026-01-28 14:32:38
发布2026-01-28 14:32:38
1280
举报
文章被收录于专栏:运维小路运维小路

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。

MySQL

PostgreSQL

MongoDB

Redis(本章节)

Etcd

我们前面在介绍数据库增删改查的时候,介绍过数据库的过期时间,今天这个小节我们来比较详细的介绍他的过期时间(TTL)。

一、Redis 基本操作命令(TTL相关)

这里我们使用的字符串类型来演示。

代码语言:javascript
复制
# 1. 设置一个普通键值对
SET user "zhangsan"

# 2. 给键设置60秒过期
EXPIRE user 60

# 3. 查看剩余过期时间(返回约50+秒)
TTL user

# 4. 移除过期时间
PERSIST user

# 5. 再次查看(返回-1,永不过期)
TTL user

# 6. 设置key的时候附带过期时间 
SETEX user1  20  "zhangsan" 

二、Redis 过期键的清理机制(核心)

Redis 不会在键过期的瞬间立即删除,而是通过三种机制来清理过期键,这是理解过期问题的关键:

1. 惰性删除(Lazy Expiration)
  • 原理:只有当客户端主动访问一个过期键时,Redis 才会检查该键是否过期,若过期则立即删除,返回空值。
  • redis-cli 验证:
代码语言:javascript
复制
# 设置键10秒过期
SETEX user1  10  "zhangsan" 
# 10秒内访问:返回zhangsan(未过期)
GET user1
# 10秒后访问:返回(nil)(惰性删除)
GET user1
# 再次查看键是否存在:返回0(已删除)
EXISTS user1

优点:节省 CPU 资源,只在必要时清理;

缺点:若过期键长期不被访问,会一直占用内存,导致内存泄漏。

2.定期删除(Periodic Expiration)
  • 原理:Redis 会每隔一段时间(默认 100ms),随机抽取一部分设置了过期时间的键,检查并删除其中过期的键。

核心规则

  • 每次抽取的键数量、检查时长都有上限,避免阻塞主线程;
  • 过期键比例越高,下次检查的频率越高(自适应调整)。
代码语言:javascript
复制
# 每100ms执行一次定期删除(默认开启)
hz 10
# 每次定期删除的最大耗时(默认250ms)
active-expire-effort 1

优点:平衡 CPU 和内存,定期清理过期键;

缺点:可能存在漏删(抽取的键不一定包含所有过期键)。

3.内存淘汰(Memory Eviction)

原理:当 Redis 内存使用达到 maxmemory 上限时,会触发内存淘汰策略,优先删除过期键(若有),若没有则删除正常键。

常见淘汰策略:(redis-cli 可通过 CONFIG GET maxmemory-policy 查看)

volatile-lru:淘汰过期键中最少使用的;

volatile-ttl:淘汰过期键中剩余时间最短的;

allkeys-lru:淘汰所有键中最少使用的(包括未过期);

noeviction:默认策略,不淘汰,内存满时拒绝写入(返回错误)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-21,如有侵权请联系 [email protected] 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 [email protected] 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB
    • 1. 惰性删除(Lazy Expiration)
    • 2.定期删除(Periodic Expiration)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档