• Redis事务和锁机制


    1.Redis中的事务

    1.1 什么是事务

    redis事务是一系列redis命令的集合。事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。在执行时不会被其他客户端发来的命令请求打断。

    1.2 特征

    Redis事务可以一次执行多个命令,并且带有以下两个重要特征:
    1.事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
    2.事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

    1.3 事务执行的3个阶段

    • 开始事务;
    • 命令入队;
    • 执行事务。

    1.4 事物的命令

    1. discard:取消事务,放弃执行事务块内的所有命令;
    2. exec:执行所有事务块中的命令;
    3. multi:标记一个事务块的开始;
    4. watch:监视一个(或多个)key,如果在事务执行之前这个key被其他命令所改动,那么事务将被打断
    5. unwatch:取消watch命令对所有key的监视。

    1.5 事务内部的错误处理

    一个事务的运行期间分为两种情况:
    1.运行错误:如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不支持回滚。如示例1所示。
    2.语法错误:组队中某个命令出现了报告错误,(已经提示错误)再执行时整个的所有队列都会被取消

    在执行EXEC命令之前,客户端可以检查放入队列的命令的返回值,返回值是QUEUE字符,表示正确地将这命令放入队列中,否则Redis返回一个错误。如果是放入队列发生错误,那么中止事务,并丢弃这个事务。如示例2所示。

    1.6 Redis事物的原子性

    示例1:
    在这里插入图片描述
    事务中执行的命令 如果有命令执行失败,不具备原子性
    示例2:
    在这里插入图片描述
    事务中执行的命令如果有命令错误(语法错误),具备原子性

    结论:
    redis事务具备原子性。

    事务中执行的命令如果有命令错误(语法错误),具备原子性;但是,事务中执行的命令 如果有命令执行失败,不具备原子性,生产阶段很少出现,会通过软件测试避免。

    1.7 Redis 事务三特性

    1. 单独的隔离操作
      事物的所有命令都是序列化的、按顺序地执行。在执行过程中不会被其他事务打断。
    2. 没有隔离级别的概念
      队列中的命令没有提交之前,其实没有被执行。
    3. 不保证原子性
      事务中如果又一条命令在执行时失败,其后面的命令仍然可以被执行,没有回滚操作。

    2.CAS算法

    redis中watch使用的是cas算法

    CAS(Check ang Set)比较并交换,是一种无锁算法,实现多个线程在操作同一个资源时保持同步性。

    实现过程:有几个记录值,分别是旧值、新值和更新值,当要开始操作资源时,先在线程的缓存中记录一个旧值,开始对值进行修改(修改的不是主存,而是缓存)记录到更新值中,在更新主存前,再次读取主存值存到新值中,用新值和旧值比较,如果相同,则将更新值更新到主存中,如果不相同则取消这次操作。

    CAS算法适用于计算值、更新值的操作;而线程同步锁(synchronized)适用于只进行过程操作的线程。
    在这里插入图片描述

    3.锁机制

    3.1 悲观锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

    3.2 乐观锁

    乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
    Redis就是利用这种check-and-set机制实现事务的

    乐观锁举例

    定义两个事务, 要求两个事务抢一张车票,其中只能有一个事务抢到票。(ticket用来存储车票)

    事务1:
    在这里插入图片描述
    事务1抢到了票。

    事务2:
    在这里插入图片描述

  • 相关阅读:
    元宇宙崛起:区块链与金融科技共绘数字新世界
    winRAR常用命令
    vue基础 组合式和响应式 && 模板语法 && 计算属性
    AWS实战(一)-创建S3 存储桶
    ElasticSearch--分片和副本--原理
    【二叉树的最近公共祖先】【后序遍历】Leetcode 236. 二叉树的最近公共祖先
    k8s--基础--23.1--认证-授权-准入控制--介绍
    3dsmax2021软件安装教程
    一、爬虫-爬取豆瓣电影案例
    复旦微开发过程中遇到的问题总结(三)
  • 原文地址:https://blog.csdn.net/aigo_2021/article/details/126352336