事务说明
redis事务就是连续顺序执行多条指令,中间不被打断或者干扰,一个队列中,一次性、顺序性、排他性的执行一系列命令。
事务的边界
开启事务:multi
开启事务,后续的所有指令均加入到事务中
执行事务:exec
结束向事务中添加指令并开始执行事务, 与multi成对使用
取消事务:discard
结束当前事务且不执行事务中的指令,当发现指令录入异常或错误时,输入此命令结束当前事务
注意:
1.指令集合中存在指令的语法错误会直接结束事务。
2.指令集合中存在语法没有问题,但是无法正确执行的情况,例如数据类型不匹配等,会把能执行的执行了,不能执行的输出错误信息,需要程序员自己控制数据回滚。
手动回归方案:在执行事务之前,先获取当前需要修改的数据和状态,当发现错误时在set回去
事务-锁
锁的作用:在事务exec(执行)之前,如果数据发生了变化,则不再修改这个key的数据,避免对一个出现数据重复操作异常
添加锁:watch key1 [key2......]
需要在事务开启之前执行
取消锁:unwatch
在事务之前执行,会取消所有的锁
事务-分布式锁
业务场景:redis是单线程的,但是存在多个客户端修改同一个数据的情况,不是watch监控一个值有没有改变能解决的问题
执行逻辑:一个客户端拿到锁之后先把数据锁上再执行操作,其他客户端发现如果被锁上了只能等待,无法控制修改数据,当第一个客户端操作完成之后释放修改后的数据,第二个客户端才能拿到数据,并根据第一个客户端操作后的数据进行相应的业务判断或者控制修改数据。
开启公共锁:setnx lock-key value
setnx lock-需要锁的key ,value随意赋值即可
释放锁:del lock-key
锁和分布式锁的区别
锁:在事务上使用,多个客户端在操作同一个数据时,如果检测到数据被修改,阻断当前操作避免重复执行
公共锁:多个客户端操作一个数据时,其他客户端等待当前客户执行完毕后接着执行。
死锁解决方案
当一个客户端加锁以后一直不释放,其他客户端将会一直等待不能操作数据,可以可锁加个时效,当超过时效后自动释放,其他客户端可以接着操作。
添加时效指令:
在添加公共锁指令后开始执行
expire lock-key second 设置秒锁
pexpire lock-key milliseconds 设置毫秒级锁
具体锁的时间根据实际业务设定