如何用Redis实现事物以及锁?


大家好,我是卷心菜。本篇主要讲解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秒过后,其它的客户端就可以拿到锁、实施业务操作、释放锁了。


感谢阅读,一起进步,嘻嘻~

猜你喜欢

转载自blog.csdn.net/weixin_59654772/article/details/125707765
今日推荐