【Redis】Redis 解决事务冲突之乐观锁和悲观锁

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis】Redis 解决事务冲突之乐观锁和悲观锁

一、Redis的事务冲突问题

例子:

比如说,3个人有你的账户:你有10000元 一个人请求想给金额减 8000

一个人请求想给金额减 5000

一个人请求想给金额减 1000

image.png

二、悲观锁

image.png

悲观锁(Pessimistic Lock) ,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁(上锁后不允许其他事务操作),这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

缺点是效率低,只能串行操作

三、乐观锁

image.png

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,所以所有人都可以拿到数据,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制

读数据的时候畅通无阻,更新数据的时候需要匹配读出来的数据的版本号和数据库内数据的版本号,一致则可修改,修改后写回数据库;若更新数据时,和数据库内数据的版本号不一致,就不允许更新,需要读出新版本号的数据继续操作

乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

四、乐观锁的使用

在执行 multi开启事务之前,先执行 watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

image.png

unwatch 取消 WATCH 命令对所有 key 的监视:如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了

watch监视功能通过乐观锁实现

两个终端都监视balance并开启事务

image.png

image.png

终端1对balance加10

image.png

终端1对balance加20

image.png

终端1 exec执行事务成功

image.png

终端2 exec执行事务失败

image.png

分析:  乐观锁导致终端2事务执行失败;2个终端都得到balance这个数据,都对它监视,第一个终端先加10,然后就更新了版本号了,第二个终端执行加20,判断读取出来的balance的版本号和数据库里balance版本号,发现不一样了,就不能执行操作了

五、Redis 事务三特性

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
  • 没有隔离级别的概念:开启事务后,没有exec提交之前命令只是存放在队列中,都不会实际被执行
  • 不保证原子性:事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚(这点和MySQL的原子性不一样)



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
3月前
|
监控 NoSQL Redis
Redis事务和Redis管道
Redis事务和Redis管道
46 0
|
4月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
99 0
|
5月前
|
NoSQL 关系型数据库 MySQL
Redis(事务)
Redis(事务)
51 2
|
5月前
|
监控 NoSQL 关系型数据库
深入浅出Redis(五):Redis的事务机制与ACID原则
深入浅出Redis(五):Redis的事务机制与ACID原则
|
5月前
|
监控 NoSQL 关系型数据库
Redis 事务 与 管道
Redis 事务 与 管道
38 0
|
16天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
2月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
|
2月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
58 0
下一篇
无影云桌面