Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
发送者可以向多个订阅者发送消息,订阅者可以收到多个发送者送来的消息,也就是是说发送者和订阅者是多对多的关系
实例
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:
订阅者订阅主题
发布者发布主题
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
"redisChat"为主题名,"Redis is a great caching technique"为收到的消息
注意,如果发布中文的话,直接是看不到的
想要正确显示中文,再连接redis客户端的时候使用--raw参数,就可以了
接收多个频道
发布者发给redisChat的消息
Redis 事务命令
下表列出了 redis 事务的相关命令:
Multi、Exec、discard
从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的 命令队列中的命令依次执行。
实例
sadd 集合的数据类型
smembers 查看集合型数据
get key 查看kv值
smembers key 查看集合的数据
事务的错误处理
组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
组队阶段报错,提交失败
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
Redis Incr 命令将key中储存的数字值增一。
如果key不存在,那么key的值会先被初始化为0 ,然后再执行INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64 位(bit)有符号数字表示之内。
为什么要做成事务
不同的对象同时对一个账户进行操作,到底以哪一个提交为准,就会造成redis的事务冲突。
怎么解决事务的冲突
1、悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的 时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上 锁。
2、乐观锁
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的 应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。
原来有10000块,版本为1.0,消费8000之后,版本号变成了1.1,此时进行操作只能在1.1版本之后进行操作。而想消费5000,是在10000元的1.0版本上操作,但此时版本号已经变成了1.1,版本号不匹配,故不能操作。
乐观锁会匹配版本号,只要版本号一致才能进行操作。
Redis事务三特性
1、Redis主从复制原理
2、实战Redis主从复制
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主 服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机 制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的 可扩展性和数据冗余很有帮助。
搭建架构图
准备三台服务器
192.168.198.142 为主服务器
192.168.198.150 为从服务器
192.168.198.151 为从服务器
准备工作略:注意防火墙 selinux iptables 时间同步等
搭建步骤
一、安装redis
首先给三台服务器分别安装redis。过程可参考前面章节
二、配置主服务器
1、进入主服务器,打开redis配置文件,修改protected yes为no,即关闭保护模式让其他主机也能连接
2、将bind 127.0.0.1这行注释或者指定ip。(本例是注释,即所有ip都能连接)
3、开启守护进程 daemonize yes
4、设置访问密码(由于redis性能非常高,撞库风险极大,建议线上把密码设置非常复杂,最好能在第2步中指定 ip)。
将appendonly yes 改为no,因为默认是rdb存储
至此主服务器配置完毕! 启动redis服务。
三、配置从服务器
1-4步与主服务器配置基本一致
5、配置所属主服务器ip和端口,声明它是142的从机
6、配置所属主服务器的密码
需要注意的是,从服务器通常是只读,所以要配置只读(默认是只读,不要更改即可) 配置完成, 启动服务
四、测试
使用redis客户端或者telnet都可以
本次使用redis客户端
1、进入主服务器(192.168.198.142) 进入redis客户端,由于设置了密码,所以需要鉴权
2、进入从服务器(192.168.198.150,192.168.198.151) 使用get命令获取name的值,可以看到
至此,redis主从复制配置并验证完成
1、Redis发布订阅
① 进入redis安装目录,使用./src/redis-server redis.conf开启redis服务
② 查看是否启动成功:使用 ps -ef |grep redis 命令过滤是否有6379端口,有则是开启成功
③ 使用./src/redis-cli 命令连接redis客户端
④ 因为我设置了密码,所以连接成功后先输入auth 123456验证,验证成功后进行后续操作
⑤ 使用 subscribe redisChat 命令订阅redisChat频道,此时这个redis客户端就变成了“订阅者”
⑥ 使用 publish redisChat “Master Linux in 21 days” 给redisChat频道发布消息为“Master Linux in 21 days”
⑦ 使用subscribe mytest redisChat 可以同时订阅mytest,redisChat两个频道,这时订阅者可以收到来自这两个频道的消息
Redis发布订阅注意事项:
① 直接使用./src/redis-cli命令连接redis客户端不能直观看出中文消息,想要看出中文消息就在./src/redis-cli命令后面加--raw参数就可以
②发布客户端可以向多个订阅客户端发送消息,订阅客户端可以订阅多个发布客户端,也就是说,发布客户端和订阅客户端是多对多的关系
① MULTI开启事务,自此,输入的命令进入命令队列;只要事务没有执行就可以通过discard退出事务;使用exec执行事务,一旦执行不能回滚;
② 使用MULTI开启事务后,一旦命令队列中有命令输错,则整个命令队列不会被执行;执行命令队列时,某个命令报错,只有该命令不会被执行,其他命令会继续执行
③ 为什么要有事务?防止事务冲突。
④ 如何解决事务冲突?加悲观锁或者乐观锁。悲观锁,顾名思义,再执行事务时,认为别人也会执行 ,就给他加上锁,这样其他事务就无法操作这个事务,只有等它释放锁,其他人才能操作。乐观锁,顾名思义,执行事务时认为其他人不会操作这个事务,不给它加锁,但是会匹配版本号,只有版本号匹配成功才能操作这个事务。
⑤ Redis事务特性:隔离性,没有隔离级别,不保证原子性
① Redis主从复制原理:从服务器启动并成功连接到主服务器时会向主服务器发送一条sync命令,主服务器收到该命令后,启动后台的存盘进程,将收集到的修改数据集命令在后台执行,执行完成之后,将整个rdb文件传送到从服务器,自此完成了一次完全同步。只要从服务连接到主服务器,就会完成一次完全同步。