Redis实现事物以及锁的方法
一、什么是Redis事物
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
作用:
串联多个命令防止别的命令插队。
二、Redis 事务命令
下表列出了 redis 事务的相关命令:
注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
三、命令行演示
演示事物的开始、执行
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set name cabbage
QUEUED
127.0.0.1:6379(TX)> set age 20
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
演示事物的开始与取消:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set name cabbage
QUEUED
127.0.0.1:6379(TX)> set age 20
QUEUED
127.0.0.1:6379(TX)> DISCARD
OK
127.0.0.1:6379> keys *
(empty array)
演示事物的watch:
四、事物注意事项
指命令书写格式有误时
,整体事务中所有命令均不会执行,包括那些语法正确的命令
指命令格式正确,但是无法正确的执行时
,能够正确运行的命令会执行,运行错误的命令不会被执行且对应的数据不会实现回滚。
五、事务三特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
六、分布式锁
业务分析:
虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?
解决方案:
使用 expire 为锁key添加时间限定,到时不释放,则放弃锁
命令行演示:
127.0.0.1:6379> set name cabbage
OK
127.0.0.1:6379> setnx lock_time 1
(integer) 1
127.0.0.1:6379> EXPIRE lock_time 20
(integer) 1
127.0.0.1:6379> get name
"cabbage"
通过这种方式,即使某个客户端由于某种原因没有手动释放锁,也不会造成死锁。因为设置了锁lock_time
的有效时间为20秒,当20秒过后,其它的客户端就可以拿到锁、实施业务操作、释放锁了。
到此这篇关于Redis实现事物以及锁的方法的文章就介绍到这了,更多相关Redis 事物及锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341