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 seconds
  • PEXPIRE key milliseconds
  • EXPIREAT key unix_timestamp
  • SET 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-lru
  • allkeys-lfu / volatile-lfu
  • allkeys-random / volatile-random
  • volatile-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_keysevicted_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

练习#

  1. db1 中创建 3 个带过期时间的键,分别设置 10s、30s、60s,观察 INFO keyspace 的变化。
  2. maxmemory 设置为 5MB,写入 1MB 键值 10 次,记录 evicted_keys 增长情况。
  3. 使用 PERSIST 取消某键过期后,确认 TTL 返回 -1