四个交互演示:① 事务+WATCH · ② Pipeline 对比 · ③ Lua 沙盒 · ④ Stream 消费组
左侧客户端 A 用 WATCH + MULTI/EXEC 修改 balance;右侧客户端 B 同时操作同一个 Key。观察 A 在 EXEC 时如果 B 改过被 watch 的 key,会返回 (nil) 触发重试。
watched_keys 记录每个 key 被谁监视。任何写命令执行时,会给监视者打上 DIRTY_CAS 标记。EXEC 时如果发现自己被打标,整个事务作废返回 (nil)。这就是「乐观锁」——不阻塞别人,提交时检查冲突。以下三种方式都发送 100 条 SET 命令。蓝色方块 = 请求;绿色 = 响应。点「开始」看动画对比 RTT 总耗时。
支持 redis.call('GET'/'SET'/'INCR'/'DECR'/'INCRBY'/'DECRBY'/'EXPIRE'/'EXISTS'/'DEL', ...) 调用,
KEYS[i]、ARGV[i]、tonumber、tostring、local、if/elseif/else/end、
return。脚本在「服务端」原子执行,不会被打断。
KEYS[1]、ARGV[1]。左侧 Producer 不停 XADD;右侧两个 Consumer(worker-1 / worker-2)在同一个 Group payproc 中协作,每条消息只投递给一个 worker。点 ACK 把消息从 PEL 移除;点 XCLAIM→W1 把消息抢给 worker-1。
XREADGROUP STREAMS x 0 能拿回未 ACK 消息,超时还能用 XCLAIM 转给别的 worker 接管。这就是真正的消息队列语义。