Redis的消息订阅及发布及事务机制

订阅发布

SUBSCRIBE PUBLISH

订阅消息队列及发布消息。

# 首先要打开redis-cli shell窗口 一个用于消息发布 一个用于消息订阅
# SUBSCRIBE 订阅一个频道,如果频道不存在 就新增一个
# 返回参数 表示 第一个是命令 第二个是频道名称 第三个表示当前订阅该频道的数量
127.0.0.1:6379> SUBSCRIBE mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1 # 在另外一个shell窗口 进行消息发布
127.0.0.1:6379> PUBLISH mychannel "hello world"
(integer) 1 # 在回到之前的shell 窗口 我们可以看到消息已经被订阅成功了
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
# 下面是本次接受到消息
1) "message"
2) "mychannel"
3) "hello world"

UNSUBSCRIBE

UNSUBSCRIBE:取消订阅。

# 第三个返回值表示当前没有订阅者订阅该频道
127.0.0.1:6379> UNSUBSCRIBE mychannel
1) "unsubscribe"
2) "mychannel"
3) (integer) 0

PSUBSCRIBE PUNSUBSCRIBE

根据通配符进行订阅户或者取消订阅。

127.0.0.1:6379> PSUBSCRIBE my*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "my*"
3) (integer) 1
# 在另外一个Shell发布消息
127.0.0.1:6379> PUBLISH mychannel "hello world"
(integer) 1
127.0.0.1:6379> PUBLISH mynewchannel "hello world new"
(integer) 1
# 此时第一个Shell窗口就可以到如下的订阅消息
1) "pmessage"
2) "my*"
3) "mychannel"
4) "hello world"
1) "pmessage"
2) "my*"
3) "mynewchannel"
4) "hello world new"

事务

Redis支持事务,是基于4个基本指令。

  • MULTI 开启事务
  • EXEC 执行事务
  • DISCARD 放弃事务
  • WATHC 监控

MULTI EXEC

MULTI命令开启一个事务,执行MULTI之后,客户端可以向服务器发送多条指令,这些指令不会立即执行,而是被放入队列中,当执行EXEC时,队列中的所有命令才会被执行。

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age 3
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 4
127.0.0.1:6379> get age
"4"
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 19
3) (integer) 22
127.0.0.1:6379> get age
"22"
127.0.0.1:6379>

事务中错误的情况

  • 如果是入队的时候就报错,那么即使在输入EXEC指令,事务也不会执行。
  • 如果是入队成功,但是执行的时候报错,那么会执行正确的指令,错误的会被跳过,不会终止事务。
## 事务中出现错误的情况 入队错误 事务不执行
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
# 写错指令 出现错误提示
127.0.0.1:6379> INCR age 3
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get age
"22" ## 事务中出现错误的情况 入队正确 执行错误 事务正常执行
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age abc
QUEUED
127.0.0.1:6379> INCRBY age 4
QUEUED
127.0.0.1:6379> exec
1) (integer) 23
2) (error) ERR value is not an integer or out of range
3) (integer) 27
127.0.0.1:6379> get age
"27"

由第二错误示例可以看到,Redis的事务是不支持回滚的。这是因为Redis考虑到是失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,另外Redis不支持回滚能够保持Redis 的内部可以保持简单且快速。

DISCARD

放弃事务。

127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get age
"22"

WATCH

Redis中的CAS操作。WATCH 使得 EXEC 命令需要有条件地执行: 事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。当执行EXEC指令后,对key的WATCH会被取消。

​ 被 WATCH 的键会被“监控”,如果有任意一个或多个被监视的键在 EXEC 执行之前被修改了, 整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。

# 第一个窗口
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 19
QUEUED
# 在第二个窗口 设置
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
# 在第一个窗口执行事务 因为age已经被更改了,所以本次事务执行失败
127.0.0.1:6379> EXEC
(nil) ## 被监控的Key没有变化时 事务可以正确执行
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get age
"25"

以上就是Redis中订阅发布及事务的的常用操作指令了,更多其他指令可以参考官网,Redis官网,谢谢阅读,希望对你有所帮助。

Redis的消息订阅及发布及事务机制的更多相关文章

  1. 基于redis的消息订阅与发布

    Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端. 作为例子, 下图展示了频道 channel1  ...

  2. Java实现Redis的消息订阅和发布

    1.  首先需要一个消息监听器类 package com.sogou.baike.testimport.testSubscribe; import redis.clients.jedis.JedisP ...

  3. websocket+nodejs+redis实现消息订阅和发布系统

    其实我很懒,不想打字,代码已上传到码云,请点此处. 有疑问请一下扫描二维码,加我微信:

  4. Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化

    5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...

  5. spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)

    一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...

  6. vue - Vue脚手架/消息订阅与发布

    今天的内容有意思了,朋友们继续对我们之前的案例完善,是这样的我们之前是不是靠props来完成父给子,子给父之间传数据,其实父给子最好的方法就是props但是自给父就不是了,并且今天学下来,不仅如此,组 ...

  7. Vue学习之--------消息订阅和发布、基础知识和实战应用(2022/8/24)

    文章目录 1.基础知识 2.代码实例 2.1 main.js 2.2 School.vue 2.3 Student.vue 2.4 App.vue 3.全局事件总线通信改为消息的订阅和发布 3.1 核 ...

  8. 基于Redis的消息订阅/发布

    在工业生产设计中,我们往往需要实现一个基于消息订阅的模式,用来对非定时的的消息进行监听订阅. 这种设计模式在 总线设计模式中得到体现.微软以前的WCF中实现了服务总线 ServiceBus的设计模式. ...

  9. [SpingBoot guides系列翻译]Redis的消息订阅发布

    Redis的消息 部分参考链接 原文 CountDownLatch 概述 目的 这节讲的是用Redis来实现消息的发布和订阅,这里会使用Spring Data Redis来完成. 这里会用到两个东西, ...

随机推荐

  1. BeanPostProcessor(转)

    BeanPostProcessor简介 BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口.接口声明如下: public interface BeanPostProc ...

  2. Gitlab+Jenkins+Docker实现net core持续集成

    前言 在项目中使用这一套自动集成的体系之后,一直想找个时间总结出来,用于自己记录也打算将自己的所得分享给园友们,不经常写文章,可能会有错误的地方,希望各位不吝指正,我会及时的改正并表示感谢,希望大家能 ...

  3. Electron开发使用Vue Devtools

    转自 [https://orchidflower.oschina.io/2017/03/29/Using-Vue-Devtools-in-Electron/] 2.2 安装步骤 首先在Chrome中安 ...

  4. 两台linux服务器相互拷贝文件的两个方法

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  5. Redis 历史版本下载URL

    Redis 历史版本下载URL: http://download.redis.io/releases/ Redis和RedisClient 官网下载方式: https://blog.51cto.com ...

  6. Linux培训教程 linux磁盘分区详解

    在学习 Linux 的过程中,安装 Linux 是每一个初学者的第一个门槛.在这个过程中间,最大的困惑莫过于给硬盘进行分区.虽然,现在各种发行版本的 Linux 已经提供了友好的图形交互界面,但是很多 ...

  7. python Tkinter 编程

    Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序. 由于 Tkinter 是内置到 python 的安装包中.只要安装好 Py ...

  8. POJ 2182 Lost Cows (树状数组 && 二分查找)

    题意:给出数n, 代表有多少头牛, 这些牛的编号为1~n, 再给出含有n-1个数的序列, 每个序列的数 ai 代表前面还有多少头比 ai 编号要小的牛, 叫你根据上述信息还原出原始的牛的编号序列 分析 ...

  9. Codeforces Round #287 (Div. 2) E. Breaking Good 路径记录!!!+最短路+堆优化

    E. Breaking Good time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  10. C#读取word文档中的内容

    原文地址 http://blog.csdn.net/yhrun/article/details/7674540 在使用前需要添加引用巨硬的com组件:Microsoft Word 12.0 objec ...