Redis 测试:过期 key 内存释放情况
1 测试目的
验证 Redis key 过期后的内存释放效果。
Redis 对过期 key 的内存释放主要有两个机制:
- 惰性删除:访问一个 key 时检查这个 key 是否过期,如果过期则删除该 key。
- 定期删除:Redis 内部事件循环,当该事件循环时会检查一批 key,将过期的 key 删除。
2 测试方法
- 启动 Redis
- 使用脚本写入数据
- 写入完成后查看 redis-server 进程内存占用和 Redis 内部统计的内存占用信息
- 等待 TTL 到期,重新查看内存释放情况
使用以下脚本向 Redis 插入约 1GB 测试数据,每条 key 都带过期时间:
#!/bin/bash# 参数配置
TOTAL_KEYS=1000000 # 总 key 数
VALUE_SIZE=1024 # 每条 value 字节数(1KB)
TTL=60 # key 过期时间,单位秒# 生成 value 字符串(全 0)
VAL=$(head -c $VALUE_SIZE /dev/zero | tr '\0' '0')# 批量写入 Redis
(
for ((i=1;i<=TOTAL_KEYS;i++)); doecho "SET key:$i $VAL EX $TTL"
done
) | redis-cli --pipe
使用以下命令分别查看 redis-server 进程内存占用和 Redis 内部统计的内存占用信息:
# 查看进程内存占用
pidof redis-server | xargs ps -o pid,comm,rss -p
# 查看 redis 内部统计的内存占用信息
redis-cli -p 6379 info memory | grep used_memory_human
3 测试结果
3.1 Redis 3.2.1
写入数据脚本执行完成后,查看内存情况:
PID COMMAND RSS70295 redis-server 1382500
used_memory_human:1.28G
Redis 内存占用大约在 1G。等待 30s key 过期后,再次查看内存情况:
PID COMMAND RSS70295 redis-server 10652
used_memory_human:801.09K
Redis 内存占用大幅度下降,说明带 TTL 的 key 过期后,内存能够成功被释放。
3.2 Redis 6.2.10
写入数据脚本执行完成后,查看内存情况:
PID COMMAND RSS65526 redis-server 1361984
used_memory_human:1.28G
Redis 内存占用大约在 1G。等待 30s key 过期后,再次查看内存情况:
PID COMMAND RSS65526 redis-server 20844
used_memory_human:854.12K
Redis 内存占用大幅度下降,说明带 TTL 的 key 过期后,内存能够成功被释放。