Redis的消息订阅及发布及事务机制
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的消息订阅及发布及事务机制的更多相关文章
- 基于redis的消息订阅与发布
Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端. 作为例子, 下图展示了频道 channel1 ...
- Java实现Redis的消息订阅和发布
1. 首先需要一个消息监听器类 package com.sogou.baike.testimport.testSubscribe; import redis.clients.jedis.JedisP ...
- websocket+nodejs+redis实现消息订阅和发布系统
其实我很懒,不想打字,代码已上传到码云,请点此处. 有疑问请一下扫描二维码,加我微信:
- Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化
5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...
- spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)
一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...
- vue - Vue脚手架/消息订阅与发布
今天的内容有意思了,朋友们继续对我们之前的案例完善,是这样的我们之前是不是靠props来完成父给子,子给父之间传数据,其实父给子最好的方法就是props但是自给父就不是了,并且今天学下来,不仅如此,组 ...
- 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 核 ...
- 基于Redis的消息订阅/发布
在工业生产设计中,我们往往需要实现一个基于消息订阅的模式,用来对非定时的的消息进行监听订阅. 这种设计模式在 总线设计模式中得到体现.微软以前的WCF中实现了服务总线 ServiceBus的设计模式. ...
- [SpingBoot guides系列翻译]Redis的消息订阅发布
Redis的消息 部分参考链接 原文 CountDownLatch 概述 目的 这节讲的是用Redis来实现消息的发布和订阅,这里会使用Spring Data Redis来完成. 这里会用到两个东西, ...
随机推荐
- safari兼容时间格式 NAN
问题: safari中不支持2018-08-01这种格式转为时间戳会显示NaN 方案: new Date('2018/08/01').getTime() 将-转化为/ // 正则替换 new Date ...
- HDU-6546-Function(贪心)
链接: https://vjudge.net/problem/HDU-6546 题意: wls 有 n 个二次函数 Fi(x) = aix2 + bix + ci (1 ≤ i ≤ n). 现在他想在 ...
- Hibernate实体对象的生命周期(三种状态)
瞬时状态(Transient) 通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态. Session对于瞬时状态的Java对象是一无所知的, ...
- tf.expand_dims和tf.squeeze函数
from http://blog.csdn.net/qq_31780525/article/details/72280284 tf.expand_dims() Function tf.expand_d ...
- 电脑右键新建没有xmind文件选项解决方法
xmind还是方便的. 打开注册表,展开HKEY_CLASSES_ROOT,展开.xmind(如果没有请新建).在里面新建ShellNew项,并展开,在里面新建NullFile这个字符串值. 如果还是 ...
- max pool实现
题目 二维矩阵(nm) 求每个(lw)的子矩阵的最大元素, 就是一维滑动窗口的升级版 自己瞎掰的题解 #include <bits/stdc++.h> using namespace st ...
- 一个ros包依赖另一个ros包提供的库
背景: 编写一个点云配准的ros包,记为A,在其中打算使用多种点云配准算法. 同一个ros工作空间下有另一个ros包,记为B,B中提供了几种点云配准算法,并将它们都编译成一个库文件并安装在工作空间中. ...
- 类锁和对象锁,synchronized修饰static方法与非static方法的区别
当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例), 作用范围是整个静态方法,作用的对象是这个类的所有对象. 当synchronized修 ...
- Spring Cloud云服务架构 - commonservice-eureka 项目构建过程
我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家: 1. 创建一个名为particle-common-eurek ...
- Tree and Permutation
Tree and Permutation 给出一个1,2,3...N的排列,显然全部共有N!种排列,每种排列的数字代表树上的一个结点,设Pi是其中第i种排列的相邻数字表示的结点的距离之和,让我们求su ...