1. Redis的事务
是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许阻塞.
1.1 开启事务
multi # 开启事务
set k1 v1 # 操作此时不执行,会加入到Queued序列中
set k2 v2
…
exec
1.2 放弃事务
discard # 放弃队列中的所有事务
1.3 Redis事务的特点
①在事务序列中一旦有命令报错,则整个事务的操作全部失败.(类似Java的编译时异常)
②在事务序列中如果命令添加的时候没有报错,在执行的时候报错,那么除了报错的命令未执行,其他的操作会继续执行.(类似Java中的运行时异常)
1.4 锁&watch监控
1.4.1 锁
1.4.1 悲观锁
悲观锁(Pessimistic Lock),每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,
这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,
写锁等,都是在做操作之前先上锁
1.4.2 乐观锁
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,
]但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多
读的应用类型,这样可以提高吞吐量。乐观锁策略:提交版本必须大于记录当前版本才能执行更新
1.4.2 CAS(Check And Set)
CAS算法,一种说法是Check And Set,即检查然后赋值,另一种说是Compare And Swap交换比较,
不过意思大概都差不多,就是为了保证数据的一致性问题.
参考一片分析比较好的博客.非阻塞同步算法与CAS(Compare and Swap)无锁算法
1.4.3 监控
先使用 watch监控数据,再开启事务,放置事务执行过程中某个事务中的数据被修改导致的数据不一致问题.
例如:经典的转账问题.
一开始:
balabce:80 debt:0
watch balance # 监控balance
消费了20之后:
balance:60 debt 20
着一系列动作就是一个事务,但是当balance减少了20之后,如果另外一个线程进行了如下操作;
incrby balance 20 # 相当于给balance又加了20,此时事务中的decrby balance 20 就会报错.事务不会成功.
原因是;在watch了balance之后,相当于加了一个版本号,在balance每操作一次版本号就改变一次,当另外一个线程
操作了balance之后版本号改变了,此时事务中的balance再执行的时候,就会检查版本号,发现此时事务中的balance的
版本号小域此时balance当前的版本号,就会报错,事务也不会成功执行.
2. 主从复制读写分离
2.1 什么是主从复制?
主机更新数据后,根据配置和策略,自动同步到各个备用机的 master/slaver的机制,master以写为主,slaver以读为主.
2.2 作用?
做到了读写分离,容灾恢复.
2.3 如何配置?
①一般情况下配置从机就可以了.
②使用 info replication
命令查看各个主从服务的信息,在没有配置之前所有的服务的role都是master主机.
③配置从机
slaveof [ip地址] [端口号]
即可配置从机服务于哪个主机
2.4 主从复制的时候几个需要注意的问题
- 当从机连接上主机之后,会自动的把主机所有的信息复制过来.
- 从机在连接到主机的情况下不允许修改和设置数据
- 从机关闭后再次打开,主从关系失效,从机内的数据是,断开连接之前的数据,当从机再次连接之后需要重新使用
slaveof [ip地址] [端口号]
连接主机. - 主机关闭之后再打开,从机仍然连接主机,主从关系不会改变.
- 当主机宕机之后如果无法修复,则需要从机充当主机的角色继续提供服务.
主从关系要配置为:
A(主) <— B(从1) <— C(从2)
此时的主从关系为传递关系.
当主机A挂掉,从机B就需要替代主机提供服务,在从机B上使用slave no one
命令表示不作为任何主机的从机,然后redis会自动的把从机B配置为主机.从机C此时依然会是B的从机.
如果过了一段时间后以前的主机A又链接了那么此时的A单独作为一个master的单主机没有从机
2.5 复制原理?
- slave启动成功连接到master后会发送一个sync命令
- Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步 - 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
- 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
2.6 哨兵模式Sentinel
2.6.1 目的
为了解决主机宕机之后,从机如何自动配置为主机的问题.
2.6.2 如何配置?
在redis的启动目录下创建sentinel.conf
文件首行添加内容:
sentinel [被监控的主机名] [IP地址] [端口号] 1
上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机
2.6.3 启动哨兵
在存放sentinel.conf
目录下执行redis-sentinel sentinel.conf
即可启动哨兵.
2.6.3 开始工作
A(主机) <— B(从机1) <— C(从机2)
redis方便之处在于,配置并启动好哨兵之后,会自动的监视各个服务的运行状态,一旦主机A宕机,立刻值B和C投票选择新的主机.
加入选择的是B作为新的主机.redis会自动为我们配置B为新的主机.如果过了一会A主机又上线了,此时A会被Redis自动配置为
B的从机,此时新的主从关系为:
A(从机1) —> B(主机) <— C(从机2)