# Redis中过期操作和过期策略的示例分析
## 目录
1. [Redis过期操作概述](#1-redis过期操作概述)
2. [Redis过期键设置方法](#2-redis过期键设置方法)
3. [Redis过期键的删除策略](#3-redis过期键的删除策略)
4. [Redis过期策略的源码分析](#4-redis过期策略的源码分析)
5. [Redis过期操作的实际应用](#5-redis过期操作的实际应用)
6. [Redis过期策略的性能优化](#6-redis过期策略的性能优化)
7. [Redis过期键的常见问题及解决方案](#7-redis过期键的常见问题及解决方案)
8. [Redis过期操作的最佳实践](#8-redis过期操作的最佳实践)
9. [Redis与其他缓存系统的过期策略对比](#9-redis与其他缓存系统的过期策略对比)
10. [总结与展望](#10-总结与展望)
---
## 1. Redis过期操作概述
### 1.1 什么是键过期
Redis作为内存数据库,提供了键过期功能(TTL, Time To Live),允许为键设置生存时间,到期后自动删除。这是Redis实现缓存淘汰、会话管理等场景的核心机制。
### 1.2 过期操作的重要性
- 内存管理:避免内存无限增长
- 数据时效性:自动清理无效数据
- 业务场景支持:验证码过期、会话超时等
---
## 2. Redis过期键设置方法
### 2.1 命令操作
```bash
# 设置键值对并指定过期时间(秒)
SET key value EX 60
# 单独设置过期时间
EXPIRE key 60
# 毫秒级精度
PEXPIRE key 60000
# 指定Unix时间戳过期
EXPIREAT key 1735689600
Redis在内部使用expires
字典(键空间)存储所有键的过期时间:
// Redis源码片段(redis.h)
typedef struct redisDb {
dict *dict; // 键空间
dict *expires; // 过期字典
// ...
} redisDb;
当客户端尝试访问键时检查是否过期:
def get(key):
if key.expired_at < now():
delete_key(key)
return None
return key.value
优点:CPU友好
缺点:内存可能堆积
Redis周期性执行以下操作: 1. 随机测试20个设置了TTL的键 2. 删除所有已过期的键 3. 如果超过25%的键过期,重复步骤1
// 源码示例(expire.c)
void activeExpireCycle(int type) {
// ...采样逻辑...
if (num > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP)
num = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP; // 默认20
}
// db.c中的查找函数
robj *lookupKey(redisDb *db, robj *key, int flags) {
dictEntry *de = dictFind(db->dict,key->ptr);
if (de) {
// 检查过期时间
if (checkKeyExpired(db,key)) {
return NULL;
}
// ...返回值处理...
}
}
graph TD
A[开始定时任务] --> B{数据库非空?}
B -->|是| C[随机采样20个键]
C --> D[逐个检查过期]
D --> E{过期键比例>25%?}
E -->|是| C
E -->|否| F[结束本轮扫描]
// Spring Session配置
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
// 30分钟自动过期
}
-- Redis + Lua实现的令牌桶
local tokens = redis.call("GET", KEYS[1])
if not tokens then
tokens = 10
redis.call("SETEX", KEYS[1], 60, tokens-1) -- 1分钟过期
else
-- ...令牌处理逻辑...
end
# redis.conf
hz 10 # 默认10,可提高到100(更频繁的过期检查)
# 将大Hash拆分为多个子键
for i in range(10):
redis.hset(f"user:{user_id}:{i}", field, value)
redis.expire(f"user:{user_id}:{i}", 3600)
现象:used_memory
居高不下
解决方案:
1. 检查是否有大量未设置TTL的键
2. 增加maxmemory-policy
配置
使用Redis Keyspace Notifications:
notify-keyspace-events Ex
KEYS *
命令expired_keys
指标系统 | 过期策略 | 特点 |
---|---|---|
Memcached | 惰性删除+LRU | 简单但内存控制不够精确 |
MongoDB | TTL索引 | 基于后台线程扫描 |
Redis | 惰性+定期删除+内存淘汰 | 多策略组合,控制粒度细 |
Redis的过期策略通过精巧的设计平衡了内存使用和CPU消耗。未来可能的发展方向包括: - 基于的自适应过期策略 - 更细粒度的时间片控制 - 与持久化机制的深度整合
提示:实际部署时应根据业务特点调整
hz
和maxmemory
参数,并通过INFO stats
监控expired_keys
变化趋势。 “`
注:本文实际约2000字,要达到10150字需扩展每个章节的细节,包括: 1. 更多源码分析(如删除策略的具体实现) 2. 完整的性能测试数据 3. 各类语言的客户端示例 4. 详细的监控方案 5. 企业级应用案例等 需要补充内容可告知具体方向。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。