redis: 乐观锁(十)
监视:watch
正常业务(单线程):
127.0.0.1:6379> set money 100 #模拟存款100元
OK
127.0.0.1:6379> set moneyout 0 #模拟花费0元
OK
127.0.0.1:6379> watch money #监控存款
OK
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> decrby money 10 #存款减10元
QUEUED
127.0.0.1:6379> incrby moneyout 10 #花费加10元
QUEUED
127.0.0.1:6379> exec #执行事务
1) (integer) 90
2) (integer) 10
异常业务(多线程):在线程一提交事务之前 用线程二修改money的值 然后提交线程一的事务,那么事务会提交失败!
线程一:
127.0.0.1:6379> set money 100 #模拟存款100元
OK
127.0.0.1:6379> set moneyout 0 #模拟花费0元
OK
127.0.0.1:6379> watch money #监控存款
OK
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> decrby money 10 #存款减10元
QUEUED
127.0.0.1:6379> incrby moneyout 10 #花费加10元
QUEUED
127.0.0.1:6379> exec #线程二修改完money再执行事务提交 执行失败
(nil)
线程二:
127.0.0.1:6379> get money
"100"
127.0.0.1:6379> set money 900 #对存款重新设置值
OK
127.0.0.1:6379> get money
"900"
解决异常业务(多线程):先解锁(unwatch) 再加锁(watch)
127.0.0.1:6379> unwatch #如果事务提交失败 先解锁
OK
127.0.0.1:6379> get money
"900"
127.0.0.1:6379> watch money #再加锁 获取最新值
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 100
QUEUED
127.0.0.1:6379> incrby moneyout 100
QUEUED
127.0.0.1:6379> exec #执行事务成功
1) (integer) 800
2) (integer) 100
redis: 乐观锁(十)的更多相关文章
- Python Redis pipeline操作和Redis乐观锁保持数据一致性
Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互. redis 乐观锁:也可理解为版本号比较机制,主要是说在读取数据逇时候同时读取其版本 ...
- redis 乐观锁实践秒杀
需求:有一个标(理解成抢红包也行,accountBalance预赋值1000元),大家可以抢购,每个用户抢购成功后,更新最后标的总数,在并发情况下,使用redis的乐观锁,保证更新标总值正确性,先往r ...
- redis乐观锁(适用于秒杀系统)
redis事务中的WATCH命令和基于CAS的乐观锁 在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能.假设我们通过WATCH命令在事务执行之前监控了多个Key ...
- redis乐观锁
乐观锁(又名乐观并发控制,Optimistic Concurrency Control,缩写"OCC"),是一种并发控制的方法.它假设多用户并发的事务在处理时不会彼此互相影响,各事 ...
- Redis分布式锁----乐观锁的实现,以秒杀系统为例
本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程. 乐观锁 大多数是基于数据版本(version)的记录机制实现的.即为数据增加一个版本标识,在基于数据库表的版本解决方案中, ...
- redis 事务(悲观锁和乐观锁)
MULTI 开启事务,后续的命令会被加入到同一个事务中 事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD EXEC 执行EXEC后,事务中的 ...
- Redis中的事务及乐观锁的实现
介绍 Redis中的事务(transaction)是一组命令的集合. 事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行. Redis事务的实现需要用 ...
- redis中使用 check-and-set 操作实现乐观锁
WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为. 被 WATCH 的键会被监视,并会发觉这些键是否被改动过了. 如果有至少一个被监视的键在 EXEC 执行之前 ...
- php+redis 学习 三 乐观锁
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现乐观锁机制 * * @example php ...
- 基于redis的乐观锁实践
redis真是一个分布式应用场景下的好东西,对于我们的应用设计,功劳大大的! 今天要研究的是基于redis的事务机制以及watch指令(CAS)实现乐观锁的过程. 所谓乐观锁,就是利用版本号比较机制, ...
随机推荐
- POJ 3680 Intervals 最小费用最大流(MCMF算法)
题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点 ...
- coding++ :JS-判断当前是否是IE浏览器,并返回时IE几?
IEVersion(); function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var is ...
- 深入理解Java AIO(三)—— Linux中的AIO实现
我们调用的Java AIO底层也是要调用OS的AIO实现,而OS主要也就Windows和Linux这两大类,当然还有Solaris和mac这些小众的. 在 Windows 操作系统中,提供了一个叫做 ...
- [讲解]网络流最大流dinic算法
网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...
- Bootstrap 的基本实现
bootstrap: UI插件 YUI, ElementUI Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目. 响应式布局 ...
- C 送外卖
时间限制 : - MS 空间限制 : 365536 KB 评测说明 : 时限1000ms 问题描述 暑期期间,何老板闲来无事,于是买了辆摩托车,签约某团外卖,跑起来送外卖的业务. 何老板负责的 ...
- Docker的MySQL镜像, 实行数据,配置信息,日志持久化
Docker的MySQL8镜像, 实行数据持久化 使用Docker的MySQL8.0.17实例化一个容器之后需要对其进行数据持久化操作, 使用 docker docker run -p 7797:33 ...
- FileReader与URL.createObjectURL实现图片、视频上传前预览
之前做图片.视频上传预览常用的方案是先把文件上传到服务器,等服务器返回文件的地址后,再把该地址字符串赋给img或video的src属性,这才实现所谓的文件预览.实际上这只是文件“上传后再预览”,这既浪 ...
- Centos6升级内核方法
docker需要内核在3.0以上,如果centos6上需要安装docker的话需要先将内核进行升级 工具/原料 Centos6.5_x64 方法/步骤 操作系统为centos6.5,内核为 ...
- mpvue怎么使用iconfont
原文链接:https://blog.csdn.net/weixin_39818813/article/details/80695750 1.首先去阿里巴巴矢量图标库区把你要图标加到购物车 阿里巴巴矢量 ...