发布与订阅模式允许客户端订阅一个或多个频道,并在其他客户端向这些频道发送消息时接收到这些消息。具体操作如下:
发布与订阅分为两类:频道订阅与退订、模式订阅与退订。
1.1 频道的订阅与退订频道的订阅命令为subscribe,在第一个终端中输入该命令后,终端会进入等待状态。
127.0.0.1:6379> subscribe news Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "news" 3) (integer) 1
然后,在另一个终端中使用publish命令发布消息:
127.0.0.1:6379> publish news "bbc news" (integer) 1 127.0.0.1:6379> publish news "雅虎 news" (integer) 1 127.0.0.1:6379> publish news "bing news" (integer) 1 127.0.0.1:6379>
此时,第一个终端会接收到发布的消息:
127.0.0.1:6379> subscribe news Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "news" 3) (integer) 1 1) "message" 2) "news" 3) "bbc news" 1) "message" 2) "news" 3) "\xe9\x9b\x85\xe8\x99\x8e news" 1) "message" 2) "news" 3) "bing news"
退订频道的命令为unsubscribe:
127.0.0.1:6379> unsubscribe news 1) "unsubscribe" 2) "news" 3) (integer) 0 127.0.0.1:6379>
Redis的所有频道订阅关系存储在pubsub_channels字典中。
1.2 模式的订阅与退订模式的订阅命令为psubscribe,在第一个终端中输入该命令后,终端会进入等待状态。
127.0.0.1:6379> psubscribe news.* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "news.*" 3) (integer) 1
在第二个终端中发布消息:
127.0.0.1:6379> publish news.it "i am news.it" (integer) 1 127.0.0.1:6379>
在第三个终端中发布消息:
127.0.0.1:6379> publish news.et "i am news.et" (integer) 1 127.0.0.1:6379>
此时,第一个终端会接收到匹配模式的消息:
127.0.0.1:6379> psubscribe news.* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "news.*" 3) (integer) 1 1) "pmessage" 2) "news.*" 3) "news.it" 4) "i am news.it" 1) "pmessage" 2) "news.*" 3) "news.et" 4) "i am news.et"
可见进行了模式匹配。
模式退订的命令为punsubscribe:
127.0.0.1:6379> punsubscribe news.* 1) "punsubscribe" 2) "news.*" 3) (integer) 0 127.0.0.1:6379>
Redis的所有模式订阅关系存储在pubsub_patterns链表中。
1.3 查看消息pubsub命令有三个子命令:
| 命令 | 描述 | 
|---|---|
| pubsub channels [pattern] | 返回当前被订阅的频道 | 
| pubsub numsub [channel...] | 返回指定频道的订阅者数量 | 
| pubsub numpat | 返回当前被订阅模式的数量 | 
127.0.0.1:6379> pubsub channels 1) "news.et" 2) "news" 3) "news.ot" 4) "news.it" 127.0.0.1:6379> pubsub numsub news 1) "news" 2) (integer) 3 127.0.0.1:6379> pubsub numpat (integer) 2 127.0.0.1:6379>
事务(transaction)的命令包括multi、exec、watch,事务开启后必须等待所有命令执行完毕后才会处理其他客户端的命令请求。
a@aMacBook-Pro-92 ~ % redis-cli --raw 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set key1 "你好" QUEUED 127.0.0.1:6379(TX)> set key2 "世界" QUEUED 127.0.0.1:6379(TX)> get key1 QUEUED 127.0.0.1:6379(TX)> get key2 QUEUED 127.0.0.1:6379(TX)> exec OK OK 你好 世界 127.0.0.1:6379>

watch命令是一个乐观锁,用于监视数据库键,在multi开启后如果有其他客户端修改了被监视的键,则事务执行失败。
127.0.0.1:6379> watch key1 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set key1 "哈哈" QUEUED 127.0.0.1:6379(TX)> get key1 QUEUED 127.0.0.1:6379(TX)> exec (nil) 127.0.0.1:6379> get key1 nihao
上述exec执行后返回nil,表示事务执行失败,因为在multi开启后且exec执行前,另一个终端修改了key1的值为nihao。
127.0.0.1:6379> set key1 "nihao" OK
事务具备四大特性:原子性、一致性、隔离性、持久性。
Redis的慢查询日志用于记录执行时间超过指定时长的命令请求,可用于监视和优化查询速度。相关选项包括slowlog-log-slower-than(超过多少微秒的命令会被记录)和slowlog-max-len(最多保存多少条慢查询日志)。
127.0.0.1:6379> config set slowlog-log-slower-than 0
OK
127.0.0.1:6379> config set slowlog-max-len 10
OK
127.0.0.1:6379> set k1 "哈哈"
OK
127.0.0.1:6379> set k2 "嗯嗯"
OK
127.0.0.1:6379> slowlog get
3
1) 1) (integer) 1640683940
   2) (integer) 9
   3) 1) "set"
      2) "k2"
      3) "嗯嗯"
   4) "127.0.0.1:52594"
2) 1) (integer) 1640683916
   2) (integer) 6938
   3) 1) "set"
      2) "k1"
      3) "哈哈"
   4) "127.0.0.1:52594"
3) 1) (integer) 1640683898
   2) (integer) 6
   3) 1) "config"
      2) "set"
      3) "slowlog-max-len"
      4) "10"
   4) "127.0.0.1:52594"
127.0.0.1:6379> slowlog len
5
127.0.0.1:6379> slowlog reset
OKmonitor命令可以将一个客户端变成监视器,实时打印当前的操作。
以上就是《Redis设计与实现》笔记3的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号