大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- Hadoop
- HDFS
- MapReduce
- Hive
- Flume
- Sqoop
- Zookeeper
- HBase
- Redis (正在更新)
章节内容
上一节我们完成了如下的内容:
- bitmap 位操作类型
- geo 空间类型 空间计算 Z阶曲线 Base32编码
- Stream类型 消息队列
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个大数据的学习环境,供我学习。
之前已经在 VM 虚拟机上搭建过一次,但是没留下笔记,这次趁着前几天薅羊毛的3台机器,赶紧尝试在公网上搭建体验一下。
- 2C4G 编号 h121
- 2C4G 编号 h122
- 2C2G 编号 h123

发布订阅
基本简介
Redis提供了订阅发布的功能,可以用于消息的传输

发布者和订阅者都是Redis的客户端,Channel则为Redis的服务端。- 发布者将消息发送到某个频道,订阅了这个频道的订阅者就能收到这条消息。
Subscribe
Redis客户端1:订阅频道1、订阅频道2
执行完之后,程序会阻塞住。
代码实现如下:
root@h121:/usr/redis/bin# ./redis-cli
127.0.0.1:6379> subscribe ch1 ch2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "subscribe"
2) "ch2"
3) (integer) 2
Publish
Redis客户端2:将消息发布到频道1、频道2
root@h121:/usr/redis/bin# ./redis-cli
127.0.0.1:6379> publish ch1 hello!
(integer) 1
127.0.0.1:6379> publish ch2 hellworld!
(integer) 1
127.0.0.1:6379>
观察结果
此时查看客户端1,可以看到消息已经拿到了:
127.0.0.1:6379> subscribe ch1 ch2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "subscribe"
2) "ch2"
3) (integer) 2
1) "message"
2) "ch1"
3) "hello!"
1) "message"
2) "ch2"
3) "hellworld!"
使用场景
哨兵模式哨兵之间通过发布与订阅的方式与Redis主服务器和从服务器进行通信。Redisson是一个分布式框架,分布式锁释放时,是使用发布订阅的方式。
事务相关
事务(Transaction),是指为单个逻辑工作单元执行一系列的操作。
ACID
Atomic(原子性):构成事务所有操作必须是一个逻辑单元,要么全部执行,要么全部失败。Consistency(一致性):数据库在事务执行前后状态都必须是稳定的或者一致的Isolation(隔离性):事务之间不会互相影响Durability(持久性):事务执行成功后必须全部写入磁盘
Redis事务
Redis事务通过multi、exec、discard、watch四个命令来完成的Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合Redis将命令集合序列化并确保处于同一个事务的命令集合连续且不被打断的执行Redis不支持回滚操作
事务相关指令
multi:用于标记事务块的开始,Redis会将后续的命令逐个放入队列中,然后使用exec原子化执行这个命令队列。exec:执行命令队列discard:清除命令队列watch:监视keyunwatch:清除监视key

实现代码如下:
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set s1 22
QUEUED
127.0.0.1:6379(TX)> hset set1 name wzk
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (integer) 1
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set s2 22
QUEUED
127.0.0.1:6379(TX)> hset set2 name kangkang
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379>
Redis 弱事务
Redis语法错误时,会导致整个任务的命令在队列里都清除
127.0.0.1:6379(TX)> set ss 111
QUEUED
127.0.0.1:6379(TX)> seta cuowu
(error) ERR unknown command `seta`, with args beginning with: `cuowu`,
127.0.0.1:6379(TX)> set m2 222
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379>
Redis事务 为什么不能回滚
大多数事务的失败都是语法错误或者类型错误,在开发阶段就可以预料的- 为了
性能方面就忽略了事务回滚是需要历史版本记录的