Redis的事物及锁操作

本文介绍了Redis中的事务处理机制及其实现方式,并详细解释了如何使用multi、discard和exec命令来确保一组操作的原子性。此外,还探讨了Redis中的锁机制,包括乐观锁的应用场景及其如何通过watch命令监控特定key的变化。

    Redis中也提供了类似数据库中的事务和锁的概念,基本用法如下:

    开启事务:multi

    取消事务:discard

    提交事务:exec

    例如转账交易,用户张三需要将自己账户中的钱转出100元到李四的账户,具体的操作可以分为两步,第一步将张三账户中的钱减少100元,第二步将李四账户的钱增加100元。这个转账交易必须是一个原子操作,也就是说上述两步必须同时执行成功,否则就会出现单边交易。在Redis中可以这样操作:


    以上就是Redis中关于事务的一个完整操作,Redis实现事务的机制很简单,就是在执行multi命令后开启事务处理,在提交事务(exec)或取消事务(discard)之前执行的所有命令都不会真正执行,而是放到一个队列QUEUE中,当执行exec时,就会从这个队列中逐条执行命令,在这期间不允许其他命令干扰执行。当执行discard命令时,就将队列中的所有命令清空不再执行。

    需要注意的是Redis的事务机制并不是像很多数据库那样的严谨,以上面的转账为例,如果在执行李四账户增加100元时,执行的是另外一个语句,而不是给李四账户增加100元钱,只要这个语句没有语法错误,而是类型错误。那么即使这个语句在执行的时候出现错误,但是在他之前命令也会正常执行,也就是说张三的账户会减少100元钱。这和数据库是不一样的。例如:


    Redis中的锁是采用的乐观锁机制,使用watch命令来监控我关心的key在使用之前是否被改动了,已订票系统为例:

这里只剩下一张票了,李四在买票之前需要监控票的状态,如果在执行watch命令和exec命令之间,正好张三将这张票买走了,如:


这时候李四再提交事务的时候就会什么都不执行。这就是Redis中锁的概念。

watch key1,key2...keyn可以监听多个key。

unwatch命令可以取消当前的所有的监控。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值