• 如何用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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 演示事物的开始与取消:
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 演示事物的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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    通过这种方式,即使某个客户端由于某种原因没有手动释放锁,也不会造成死锁。因为设置了锁lock_time的有效时间为20秒,当20秒过后,其它的客户端就可以拿到锁、实施业务操作、释放锁了。


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

  • 相关阅读:
    c++ virtual base class
    spring5上下文对象创建方式
    2023华为杯数学建模竞赛E题
    阿里云2核2G服务器40G ESSD Entry系统盘99元性能测评
    vscode中用go get下载模块失败
    471-82(647、5、92、143、148、19)
    ev-MOGA多目标进化算法(Matlab代码实现)
    微信小程序-案例:本地生活-首页(不使用网络数据请求)
    C++输入输出流解析
    基于dagger平台实现资源位的接口自动化
  • 原文地址:https://blog.csdn.net/weixin_59654772/article/details/125707765