《Redis设计与实现》笔记3

发布时间 - 2025-07-16 00:00:00    点击率:
  1. 发布与订阅

发布与订阅模式允许客户端订阅一个或多个频道,并在其他客户端向这些频道发送消息时接收到这些消息。具体操作如下:

发布与订阅分为两类:频道订阅与退订、模式订阅与退订。

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>
  1. 事务实现

事务(transaction)的命令包括multiexecwatch,事务开启后必须等待所有命令执行完毕后才会处理其他客户端的命令请求。

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

事务具备四大特性:原子性、一致性、隔离性、持久性。

  1. 慢查询日志

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
OK
  1. 监视器

monitor命令可以将一个客户端变成监视器,实时打印当前的操作。


# linux  # redis  # bing  # red  # len  # nil  # channel  # 数据库  # 退订  # 第一个  # 客户端  # 嗯嗯  # 是一个  # 你好  # 多个  # 最多  # 才会  # 执行时间 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何做网站制作流程,*游戏网站怎么搭建?  iOS正则表达式验证手机号、邮箱、身份证号等  PHP 500报错的快速解决方法  Android 常见的图片加载框架详细介绍  专业商城网站制作公司有哪些,pi商城官网是哪个?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  Laravel如何处理表单验证?(Requests代码示例)  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  C++时间戳转换成日期时间的步骤和示例代码  免费视频制作网站,更新又快又好的免费电影网站?  潮流网站制作头像软件下载,适合母子的网名有哪些?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何快速完成中国万网建站详细流程?  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在云主机快速搭建网站站点?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  如何在新浪SAE免费搭建个人博客?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何使用Collections进行数据处理?(实用方法示例)  百度浏览器如何管理插件 百度浏览器插件管理方法  java获取注册ip实例  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  PythonWeb开发入门教程_Flask快速构建Web应用  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何在香港服务器上快速搭建免备案网站?  如何为不同团队 ID 动态生成多个独立按钮  Laravel如何使用Gate和Policy进行授权?(权限控制)  使用Dockerfile构建java web环境  黑客入侵网站服务器的常见手法有哪些?  如何在IIS7中新建站点?详细步骤解析  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  b2c电商网站制作流程,b2c水平综合的电商平台?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?