Redis(下)
前言
在 大数据之Redis(上)中我们已经介绍了有关Redis的基本概念以及数据类型,本文主要介绍Redis事务、持久化、主从复制、哨兵机制以及集群的概念。
一、Redis事务
比如有三个客户端,1发送指令set k1,v1,2发送指令set k2,v2,3发送指令set k3 v3;此时比如发送速度 1>2>3,那么Redis在实现的时候,会将指令放在队列中,即k1放在队列头部,先执行set k1,v1;
但是因为Redis是一个NoSQL数据库,没有事务的概念,但是因为上述图的指令执行出现了问题,例如:
客户端发送指令都是对k1进行操作,所以最终的k1的结果由最后一个发送的指令决定,但是如果客户端1不仅有设置k1的操作,还有取k1值的操作,那么取值的结果可能是k1,k2或者k3,指令发送的顺序决定了结果对不对,即也存在事务的问题;
1.1 Redis事务的特点及作用
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队;
即:将每一个客户端发送的指令再放在一个队列中,然后将整个队列发送,这样就保证了同一个客户端的数据一致。
1.2 Redis事务的错误处理
(1)组队中某个命令出现了报告错误(也就是语法错误),执行时整个的所有队列会都会被取消;
(2)如果执行阶段某个命令报出了错误(非语法错误),则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
二、Redis持久化
2.1.RDB
2.1.1 RDB定义
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
2.1.2 RDB备份流程
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中(写时复制技术),待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
2.1.3 特点
RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
2.1.3.1 优点
节省磁盘空间,恢复速度快
2.1.3.2 缺点
(1)虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
(2)在备份周期在一定间隔时间做一次备份,所以如果Redis意外宕掉的话,就会丢失最后一次快照后的所有修改。
2.2 AOF
2.2.1 AOF定义
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
2.2.2 AOF 同步频率设置
(1)始终同步,每次Redis的写入都会立刻记入日志
(2)每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失
(3)不主动进行同步,把同步时机交给操作系统。
2.2.3 AOF 重写
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制;系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size,如果Redis的AOF当前大小>= base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。
2.2.4 AOF 特点
2.2.4.1 优点
(1)备份机制更稳健,丢失数据概率更低。
(2)可读的日志文本,通过操作AOF文件,可以处理误操作
2.2.4.2 缺点
(1)比起RDB占用更多的磁盘空间。
(2)恢复备份速度要慢。
(3)每次读写都同步的话,有一定的性能压力。
(4)存在个别Bug,造成恢复不能。
三、Redis主从复制
3.1 定义
主从复制,就是主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
3.2 作用
读写分离、性能拓展、容灾快速恢复
3.3 相关问题
(1) 从机从头开始复制而不是从切入点开始复制,即如果在主机上已经有数据,此时有从机加入,则从机会将所有的数据都复制;
(2) 从机不可以写
(3)主机shutdown后,从机原地待命
(4)其中一台从机宕机后,从机的数据就会跟不上主机,从机重启后,会默认为主机状态,原主机增加的信息也就丢失了,解决方法就是将从机配置写入到配置文件中。
3.4 复制原理
(1)每次从机联通后,都会给主机发送sync指令
(2)主机立刻进行存盘操作,发送RDB文件,给从机
(3)从机收到RDB文件后,进行全盘加载
(4)之后每次主机的写操作,都会立刻发送给从机,从机执行相同的命令
3.5 主从从机制
从机还可以有从机;
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险是一旦某个slave宕机,后面的slave都没法备份,因为后面的从机以为前面的从机是主机,并不知道真正主机的存在;
如果主机宕机了,那么从机就可以反客为主成为主机(slaveof no one)。
四、哨兵机制
4.1 定义
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。即每一个从机都会有哨兵,哨兵会监控主机的状态(心跳),如果一个哨兵发现主机没有回复,会让其他的哨兵也去询问一下。
4.2 故障恢复
五、Redis集群
5.1 定义
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N;
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
5.2 注意事项
一个集群至少要有6个节点,因为一个集群至少要有三台主机,每台主机都要有一个从机。
六、Slots
6.1 定义
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 集群中的每个节点负责处理一部分插槽。
6.2 特点
6.2.1 优点
实现扩容
分摊压力
无中心配置相对简单
6.2.2 缺点
(1)多键操作是不被支持的 ,因为你多值放入不同的key,在底层源码实现的时候,根据key来确定所属的槽点slot(类似于hash),如果槽点不同是不能批量写的;
解决:可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
(2)由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
总结
在 大数据之Redis(上)中我们已经介绍了有关Redis的基本概念以及数据类型,本文主要介绍了Redis事务、持久化、主从复制、哨兵机制以及集群的概念,至此Redis的相关内容就介绍完毕,如果有不足之处或者表述不当的地方欢迎大家指正。