8.1.9 键空间与过期机制基础
键空间概念#
- 键空间(Keyspace)是当前数据库中所有键的集合,Redis 支持 16 个逻辑库(
db0~db15,可配)。 - 关键查看命令:
INFO keyspace,展示每库键数量、过期键数量、平均 TTL。 - 键命名建议:业务前缀 + 层级分隔,例如
app:user:123,便于统计、清理与权限隔离。
安装与准备(本节示例可用环境)
# 1) Ubuntu/Debian 安装
sudo apt-get update
sudo apt-get install -y redis-server
# 2) 启动与测试
sudo systemctl enable --now redis-server
redis-cli ping
# 预期输出:PONG
键空间查看示例(可直接执行)
# 切换到 db0,写入数据并查看 keyspace
redis-cli <<'EOF'
SELECT 0
SET app:user:1 "tom"
EXPIRE app:user:1 120
SET app:order:1 "o-1001"
INFO keyspace
EOF
# 预期关键输出示例(仅示意)
# db0:keys=2,expires=1,avg_ttl=120000
过期机制基础#
- 设置过期
EXPIRE key secondsPEXPIRE key millisecondsEXPIREAT key unix_timestampSET key value EX seconds/PX milliseconds- 查看与取消
TTL key/PTTL key:查看剩余时间PERSIST key:取消过期
完整命令演示
redis-cli <<'EOF'
SET session:token "abc123"
EXPIRE session:token 30
TTL session:token
PERSIST session:token
TTL session:token
SET cache:page "html" EX 5
PTTL cache:page
EOF
# 预期效果:
# - TTL 先返回 30 左右,再返回 -1(取消过期)
# - PTTL 返回 5000 左右(毫秒)
过期删除策略#
- 定时删除:到期立即删除,开销高。
- 惰性删除:访问键时检查是否过期,若过期则删除。
- 定期删除:后台按策略周期性扫描并删除过期键。
- Redis 采用 惰性删除 + 定期删除 组合策略,兼顾性能与内存回收。
原理草图(删除触发路径)
过期键与内存淘汰#
- 过期键不会立即释放内存,需触发删除机制。
- 内存达到上限时触发淘汰策略(
maxmemory-policy): noeviction:写入报错allkeys-lru/volatile-lruallkeys-lfu/volatile-lfuallkeys-random/volatile-randomvolatile-ttl
配置示例(/etc/redis/redis.conf)
# 限制最大内存并选择策略
maxmemory 200mb
maxmemory-policy allkeys-lfu
验证淘汰(压测写入)
# 写入大量键触发淘汰
redis-cli <<'EOF'
CONFIG SET maxmemory 10mb
CONFIG SET maxmemory-policy allkeys-lru
EVAL "for i=1,50000 do redis.call('SET','k'..i,string.rep('x',200)) end return 'ok'" 0
INFO stats
EOF
# 关注输出:
# evicted_keys: >0 表示发生淘汰
关键注意事项#
- 过期时间精度:毫秒级,适合高并发场景。
- 过期不可持久继承:复制、持久化后仍保留过期属性,实际删除由过期机制触发。
- 批量过期:避免同一时间大量过期造成抖动,可引入随机偏移。
- 统计与排查:
INFO stats中关注expired_keys、evicted_keys。
排错清单与命令
# 1) 过期未生效:确认键是否存在、TTL 是否被取消
redis-cli TTL key
# 2) 过期大量堆积:看过期与淘汰统计
redis-cli INFO stats | egrep "expired_keys|evicted_keys"
# 3) 查看最大内存与策略
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
练习#
- 在
db1中创建 3 个带过期时间的键,分别设置 10s、30s、60s,观察INFO keyspace的变化。 - 将
maxmemory设置为 5MB,写入 1MB 键值 10 次,记录evicted_keys增长情况。 - 使用
PERSIST取消某键过期后,确认TTL返回-1。