点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
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:监视key
unwatch:清除监视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事务 为什么不能回滚
大多数事务的失败都是语法错误或者类型错误,在开发阶段就可以预料的- 为了
性能方面就忽略了事务回滚是需要历史版本记录的