点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- 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-cli127.0.0.1:6379> subscribe ch1 ch2
Reading messages... (press Ctrl-C to quit)1)"subscribe"2)"ch1"3)(integer)11)"subscribe"2)"ch2"3)(integer)2
Publish
Redis客户端2:将消息发布到频道1、频道2
root@h121:/usr/redis/bin# ./redis-cli127.0.0.1:6379> publish ch1 hello!(integer)1127.0.0.1:6379> publish ch2 hellworld!(integer)1127.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)11)"subscribe"2)"ch2"3)(integer)21)"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)>exec1) OK
2)(integer)1127.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事务 为什么不能回滚
大多数事务
的失败都是语法错误
或者类型错误
,在开发阶段
就可以预料的
- 为了
性能
方面就忽略了事务``````回滚
是需要
历史版本记录
的
版权归原作者 武子康 所有, 如有侵权,请联系我们删除。