【数据库开发】Redis消息通知
2023-09-27 14:20:26 时间
消息通知
任务队列
使用任务队列的好处
- 松耦合。生产者和消费者无需知道彼此的实现细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写
- 易于扩展。消费者可以有多个,而且可以分布在不同的服务器中, 借此可以轻易地降低单台服务器的负载
使用LPUSH和RPOP命令实现队列, 这里介绍一个新命令BRPOP和BLPOP BRPOP key [key ...] timeout(s) BRPOP命令和RPOP命令相似,唯一的区别是当列表中没有元素时BRPOP命令会一直阻塞住连接,直到有新元素加入
优先级队列
利用BRPOP命令可以检测多个key的功能。如果多个键都有元素,则按照从左到右顺序取第一个键中的一个元素。因此,要实现优先级队列,把优先级高的key放到前面就ok了。
发布/订阅 模式
- "发布/订阅"模式中包含两种角色,分别是发布者和订阅者。
- 订阅者可以订阅一个或若干个频道(channel)
- 发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。
命令 | 描述 |
---|---|
PUBLISH channel msg | 发布消息. 接收到这条消息的订阅者数量. 发出去的消息不会被持久化,也就是说当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的就收不到了 |
SUBSCRIBE channel [channel ...] | 订阅频道,可以同时订阅多个频道 |
UNSUBSCRIBE [channel ...] | 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道 |
PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道 |
PUNSUBSCRIBE [pattern [pattern ...]] | 退订指定的规则, 如果没有参数则会退订所有规则 |
PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态 |
注意
- 执行SUBSCRIBE命令后客户端会进入订阅状态,处于此状态下客户端不能使用除SUBSCRIBE/UNSUBSCRIBE/PSUBSCRIBE/PUNSUBSCRIBE这4个属于“发布/订阅”模式的命令之外的命令,否则会报错
- 使用PUNSUBSCRIBE命令只能退订通过PSUBSCRIBE命令订阅的规则,不会影响直接通过SUBSCRIBE命令订阅的频道;同样UNSUBSCRIBE命令也不会影响通过PSUBSCRIBE命令订阅的规则。另外容易出错的一点是使用PUNSUBSCRIBE命令退订某个规则时不会将其中的通配符展开,而是进行严格的字符串匹配,所以PUNSUBSCRIBE无法退订channel.规则,而是必须使用PUNSUBSCRIBE channel.*才能退订
进入订阅状态后客户端可能收到三种类型的回复。 每种类型的回复都包含3个值,
消息类型(第一个值) | 第二个值 | 第三个值 |
---|---|---|
subscribe:表示订阅成功的反馈信息 | 订阅成功的频道名称 | 当前客户端订阅的频道数量 |
message:表示接收到的消息 | 产生消息的频道名称 | 消息的内容 |
unsubscribe:表示成功取消订阅某个频道 | 对应的频道名称 | 当前客户端订阅的频道数量 |
第一个值为unsubscribe, 当第三个值为0时客户端会退出订阅状态,之后就可以执行其他非“发布/订阅”模式的命令了
示例:
redis A>SUBSCRIBE channel.1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel.1"
3) (integer) 1
# PSUBSCRIBE 按规则订阅
redis C>PSUBSCRIBE channel.?*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "channel.?*"
3) (integer) 1
redis B>PUBLISH channel.1 hi!
(integer) 2
#此时,C接收到回复
1) "pmessage"
2) "channel.?*" # 注意回复多了一个值,第二个值为订阅时使用的通配符
3) "channel.1"
4) "hi!"
规则channel.?*可以匹配channel.1和channel.10,但不会匹配channel.。
相关文章
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
- laravel+redis 生成订单号-当天从1开始自增
- php操作redis常用方法
- redis系列之数据库与缓存数据一致性解决方案
- 面试题:redis主从数据库不一致如何解决?
- C# Redis Server分布式缓存编程(二)
- Redis(主从复制,哨兵模式、集群)概述及部署
- 【Redis】Redis数据库
- 《Redis入门指南(第2版)》一2.5 多数据库
- Redis操作Hash工具类封装,Redis工具类封装
- linux redis hash哈希 增删改查
- redis之键与数据库
- Golang 实现 Redis(3): 实现内存数据库
- Python使用Redis数据库
- asp.net 通过redis 缓存限制接口访问频率
- Redis缓存与数据库双写一致性
- Redis在数据库事务中的增改操作
- 三:redis的List类型相关操作
- Linux 配置redis的开机自启动
- Redis Cluster 实践
- redis常用命令、数据类型讲解
- C# Redis 切换数据库
- 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)
- 实例解读什么是Redis缓存穿透、缓存雪崩和缓存击穿
- 【Redis】CentOS7安装并运行Redis
- 【Redis】什么是缓存与数据库双写不一致?怎么解决?
- 【Redis】 - Redis 6.0 新特性之多线程模型