【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)

一、Redis 发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

发送者可以向多个订阅者发送消息,订阅者可以收到多个发送者送来的消息,也就是是说发送者和订阅者是多对多的关系


实例

以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:

订阅者订阅主题

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第1张图片

发布者发布主题

现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第2张图片

"redisChat"为主题名,"Redis is a great caching technique"为收到的消息
【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第3张图片

 注意,如果发布中文的话,直接是看不到的

 想要正确显示中文,再连接redis客户端的时候使用--raw参数,就可以了

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第4张图片

 接收多个频道

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第5张图片

 发布者发给redisChat的消息

  发布者发给mytest的消息

 订阅者收到了多个发布者发布的消息【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第6张图片


二、Redis 事务

Redis 事务命令

下表列出了 redis 事务的相关命令:

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第7张图片


 Multi、Exec、discard

从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的 命令队列中的命令依次执行。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第8张图片


实例 

sadd 集合的数据类型

smembers 查看集合型数据

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第9张图片

 【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第10张图片

 get key  查看kv值

smembers key 查看集合的数据


事务的错误处理

组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第11张图片

 组队阶段报错,提交失败

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第12张图片


 如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第13张图片

 【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第14张图片

 Redis Incr 命令将key中储存的数字值增一。

如果key不存在,那么key的值会先被初始化为0 ,然后再执行INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在64 位(bit)有符号数字表示之内。


为什么要做成事务

不同的对象同时对一个账户进行操作,到底以哪一个提交为准,就会造成redis的事务冲突。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第15张图片


怎么解决事务的冲突

1、悲观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的 时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上 锁。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第16张图片


2、乐观锁

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的 应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第17张图片

原来有10000块,版本为1.0,消费8000之后,版本号变成了1.1,此时进行操作只能在1.1版本之后进行操作。而想消费5000,是在10000元的1.0版本上操作,但此时版本号已经变成了1.1,版本号不匹配,故不能操作。

乐观锁会匹配版本号,只要版本号一致才能进行操作。


Redis事务三特性

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第18张图片

三、Redis主从复制

1、Redis主从复制原理

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第19张图片

2、实战Redis主从复制

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主 服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机 制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的 可扩展性和数据冗余很有帮助。


搭建架构图

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第20张图片


 准备三台服务器

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)。

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第21张图片

将appendonly yes 改为no,因为默认是rdb存储

至此主服务器配置完毕! 启动redis服务。


三、配置从服务器

1-4步与主服务器配置基本一致

5、配置所属主服务器ip和端口,声明它是142的从机

6、配置所属主服务器的密码

【Linux】Redis高可用概述2(Redis 发布订阅、Redis 事务、Redis主从复制)_第22张图片

需要注意的是,从服务器通常是只读,所以要配置只读(默认是只读,不要更改即可) 配置完成, 启动服务

四、测试

使用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参数就可以

发布客户端可以向多个订阅客户端发送消息,订阅客户端可以订阅多个发布客户端,也就是说,发布客户端和订阅客户端是多对多的关系

2、Redis事务

① MULTI开启事务,自此,输入的命令进入命令队列;只要事务没有执行就可以通过discard退出事务;使用exec执行事务,一旦执行不能回滚;

② 使用MULTI开启事务后,一旦命令队列中有命令输错,则整个命令队列不会被执行;执行命令队列时,某个命令报错,只有该命令不会被执行,其他命令会继续执行

③ 为什么要有事务?防止事务冲突。

④ 如何解决事务冲突?加悲观锁或者乐观锁。悲观锁,顾名思义,再执行事务时,认为别人也会执行 ,就给他加上锁,这样其他事务就无法操作这个事务,只有等它释放锁,其他人才能操作。乐观锁,顾名思义,执行事务时认为其他人不会操作这个事务,不给它加锁,但是会匹配版本号,只有版本号匹配成功才能操作这个事务。

⑤ Redis事务特性:隔离性,没有隔离级别,不保证原子性

3、Redis主从复制

① Redis主从复制原理:从服务器启动并成功连接到主服务器时会向主服务器发送一条sync命令,主服务器收到该命令后,启动后台的存盘进程,将收集到的修改数据集命令在后台执行,执行完成之后,将整个rdb文件传送到从服务器,自此完成了一次完全同步。只要从服务连接到主服务器,就会完成一次完全同步。

你可能感兴趣的:(Linux,数据库,服务器,数据库,java)