跳转至

实验:Redis 在线状态

预计:60 分钟|验证:TTL、Set 去重、批量读取

目标

  • 验证独立 key 的 TTL;
  • 验证 Set 重复添加不会重复计数;
  • 理解 MGET 批量读取;
  • 观察“key 过期”和“在线集合移除”不是一回事。

准备

有 Docker 时启动临时 Redis:

docker run --rm --name kb-redis -p 6379:6379 redis:7-alpine

另开终端:

docker exec -it kb-redis redis-cli

实验一:独立 TTL

SET device:last_seen:1001 1753761600 EX 10
TTL device:last_seen:1001
GET device:last_seen:1001

等待 10 秒后:

GET device:last_seen:1001

观察 key 是否消失。

实验二:Set 去重

SADD online_devices 1001
SADD online_devices 1001
SADD online_devices 1002
SCARD online_devices
SMEMBERS online_devices

预测:SCARD 返回多少?为什么第二次添加 1001 不增加数量?

实验三:状态不自动联动

同时执行:

SET device:last_seen:1001 now EX 10
SADD online_devices 1001

等待 TTL 过期,再执行:

GET device:last_seen:1001
SISMEMBER online_devices 1001

你会发现 last_seen 已消失,但 1001 仍在 Set 中。这证明:

TTL 只负责 key 过期,不会自动执行你的业务状态迁移。

真实系统需要超时 worker 或可靠事件执行 SREM

实验四:批量读取

SET device:status:1001 online
SET device:status:1002 offline
SET device:status:1003 online
MGET device:status:1001 device:status:1002 device:status:1003

MGET 减少网络往返,但仍随 key 数增长;不要把它当无限批量接口。

实验报告

  • 我在操作前写了预测
  • 我解释了 TTL 与 Set 不自动联动
  • 我能解释 SADD 的幂等性
  • 我能解释 MGET 的收益和边界
  • 我把结论写成 90 秒口述