Redis 键空间事件通知的具体使用
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 两类通知通道</a></li><li><a href="#_label1">2. 配置开关</a></li><li><a href="#_label2">3. 事件映射速查</a></li><li><a href="#_label3">4. 监听示例</a></li><li><a href="#_label4">5. 过期事件时序</a></li><li><a href="#_label5">6. 集群注意事项</a></li><li><a href="#_label6">7. 最佳实践</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 两类通知通道</h2><table><thead><tr><th>通道</th><th>含义</th><th>消息载荷</th></tr></thead><tbody><tr><td>__keyspace@<db>__:<key></td><td>键空间通知</td><td>事件名称,如 del</td></tr><tr><td>__keyevent@<db>__:<event></td><td>键事件通知</td><td>具体键名,如 mykey</td></tr></tbody></table>
<p>可独立开启 K(Keyspace)或 E(Keyevent)前缀以精简流量。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2. 配置开关</h2>
<div class="jb51code"><pre class="brush:plain;"># redis.conf 或命令行
CONFIG SET notify-keyspace-events "KEA" # 常用:所有事件
CONFIG SET notify-keyspace-events "Kxg" # 仅键空间 + 过期 + 通用写
</pre></div>
<ul><li>空字符串关闭;</li><li>至少包含 K 或 E,否则实际不生效;</li><li><code>A</code>= 全部写操作别名(<code>g$lshztxed</code>);<code>m</code>(miss)、<code>n</code>(new) 需显式添加。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>3. 事件映射速查</h2>
<ul><li><code>DEL mykey</code> → <code>del</code></li><li><code>EXPIRE mykey 10</code> → <code>expire</code></li><li>键过期主动删除 → <code>expired</code></li><li>内存淘汰 → <code>evicted</code></li><li>新键写入 → <code>new</code></li></ul>
<blockquote><p>所有命令仅在键实际变更时产生事件。</p></blockquote>
<p class="maodian"><a name="_label3"></a></p><h2>4. 监听示例</h2>
<div class="jb51code"><pre class="brush:sql;"># 启用通知
redis-cli config set notify-keyspace-events KEA
# 终端 A:订阅全部
redis-cli --csv psubscribe '__key*__:*'
# 终端 B:测试
redis-cli set foo bar
redis-cli del foo
</pre></div>
<p>输出顺序保证:如 <code>RPOPLPUSH</code> 先 <code>rpop</code> 再 <code>lpush</code>。</p>
<p class="maodian"><a name="_label4"></a></p><h2>5. 过期事件时序</h2>
<p>过期事件在 <strong>删除时</strong> 触发,而非 TTL=0 的瞬间。若键长期未被访问,实际触发可能延迟;后台过期线程同样异步删除。</p>
<p class="maodian"><a name="_label5"></a></p><h2>6. 集群注意事项</h2>
<p>通知仅在持有目标分片的节点产生,<strong>不会广播</strong>。想监听全局事件需对每个节点建立订阅连接。</p>
<p class="maodian"><a name="_label6"></a></p><h2>7. 最佳实践</h2>
<ol><li><strong>按需开启</strong>,避免 <code>"KEA"</code> 带来的高频流量与 CPU 消耗;</li><li>业务只需 DEL/EXPIRE,可用 <code>"Kx"</code>;</li><li>使用模式订阅结合前缀过滤减少客户端解析压力;</li><li>消费端应异步处理,防止阻塞 Pub/Sub 读循环;</li><li>生产环境监控 <code>notify-keyspace-events</code> 配置变更,防止误关停导致监听失效。</li></ol>
<p>通过合理使用键空间事件通知,可轻松实现本地缓存失效、数据链路审计与实时指标上报等场景,提升系统一致性与可观测性。</p>
頁:
[1]