redis 事务(悲观锁和乐观锁)
MULTI
开启事务,后续的命令会被加入到同一个事务中
事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD
EXEC
执行EXEC后,事务中的命令才会执行
事务中的命令出错时,不会回滚也不会停止,而是继续执行下一步操作
DISCARD
取消事务,事务队列会被清空
原子性:不支持,不会回滚且继续执行,
隔离性:支持,事务中的命令顺序,不会被打断,先EXEC先执行,单机redis读写操作使用单进程单线程
持久性:不支持,redis 数据容易丢失
一致性:不支持,要求通过乐观锁watch来实现
redis 非 事务型管道:
from redis import StrictRedis # 创建redis客户端 decode_response = true 从redis中获取的数据会进行decorade,不会是byse类型
redis_client = StrictRedis(host='127.0.0.1',port=6379,db=0,decode_response=True) # 创建管道 默认就会开启事务,(设置参数,transaction=False,则不会开启事务,只会开启管道)
pipe = redis_client.pipeline(transaction=False) # 使用管道对象进行的操作
a = pipe.set('name', 'zhangsan')
b = pipe.get('name') # 不会提交事务 只是将管道打包提交给redis服务器
c = pipe.execute() print(a, b, c)
事务型管道:
#创建客服端
redis_client = StrictRedis() #创建管道,默认会开启事务
pipe = redis_client.pipeline() #使用管道对象进行操作,都会放入事务中
a = pipe.set('name':'zs')
b = pipe.get('name') #提交事务,提交事务后才会执行
c = pipe.execute()
print(a,b,c)
乐观锁:watch
redis实现乐观锁机制
机制:开启事务前,设置对数据的监听,EXEC时,如果发生数据发生过修改,事务会自动取消(DISCARD)
事务EXEC后,无论成败,监听会被移除
redis 乐观锁代码:
from redis import StrictRedis, WatchError # 创建客户端
redis_client = StrictRedis(host='127.0.0.1',port=6379,db=0,)
# 创建管道
pipe = redis_client.pipeline() while True:
try:
# 开启数据的监听 一旦调用watch, 后续操作会立即执行(后续操作不会添加到事务中)
pipe.watch('reserve_count') # 获取库存数量
count = pipe.get('reserve_count')
# 判断是否有库存
if int(count) > 0: # 有库存, 让库存 -1 # 手动开启事务
pipe.multi() # 库存-1
pipe.decr('reserve_count') # 提交事务
pipe.execute()
print('已下单') else: # 没有库存
print('已售罄')
# 移除监听
pipe.reset() break except WatchError as e: # 出现该异常, 说明监听的数据被修改了, 重试/取消
print('重试')
悲观锁: setnx 建不存在才会设置成功
setnx和redis 悲观锁代码
from redis import StrictRedis # 创建redis连接
redis_client = StrictRedis(decode_responses=True) # 设计redis悲观锁 处理秒杀超卖问题 # 先获取锁
while True:
order_lock = redis_client.setnx('lock:order', 1)
redis_client.expire('lock:order', 2) # 给锁设置过期时间, 避免锁释放失败导致死锁现象
if order_lock:
reserve_count = redis_client.get('reserve_count')
if int(reserve_count) > 0:
redis_client.decr('reserve_count')
print("生成订单")
else:
print("已售罄")
# 完成处理, 移除锁
redis_client.delete('lock:order')
break
redis 事务(悲观锁和乐观锁)的更多相关文章
- 悲观锁 vs 乐观锁 vs Redis
企业面对高并发场景采用的方案. 比如 产品抢购高并发时的超发现象. 1 悲观锁悲观锁 需要数据库本身提供支持(Oracle和MySQL都是支持的).实现细节:当前 数据库事务 读取到产品后, 就将目标 ...
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- mysql-mysql悲观锁和乐观锁
1.mysql的四种事务隔离级别 I. 对于同时运行多个事务,当这些事务访问数据库中的相同数据时,如果没有采取必要的隔离机制,就会导致各种并发问题. (1)脏读: 对于两个事物 T1, T2, T1 ...
- Hibernate解决高并发问题之:悲观锁 VS 乐观锁
高并发问题是程序设计所必须要解决的问题,解决此类问题最主要的途径就是对对程序进行加锁控制.hibernate对加锁机制同样做出了实现,常用加锁方式为悲观锁和乐观锁.悲观锁指的是对数据被外界(包括本系统 ...
- mysql的锁--行锁,表锁,乐观锁,悲观锁
一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...
- 025 hibernate悲观锁、乐观锁
Hibernate谈到悲观锁.乐观锁,就要谈到数据库的并发问题,数据库的隔离级别越高它的并发性就越差 并发性:当前系统进行了序列化后,当前读取数据后,别人查询不了,看不了.称为并发性不好 数据库隔离级 ...
- Mysql锁机制--乐观锁 & 悲观锁
Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...
- Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...
- MySQL学习笔记(四)悲观锁与乐观锁
恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...
随机推荐
- go1.13 mod 实践和常见问题
实践建议 0,go mod 要求所有依赖的 import path 的path 以域名开头,如果现有项目转1.13的go mod 模式,且不是以域名开头则需要修改. eg: code.be.mingb ...
- python爬虫--爬虫与反爬
爬虫与反爬 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,从而限制其访问,如果误伤过高,反爬效果再好也不能使用(例如封i ...
- Elasticsearch系列---初识搜索
概要 本篇主要介绍搜索的报文结构含义.搜索超时时间的处理过程,提及了一下多索引搜索和轻量搜索,最后将精确搜索与全文搜索做了简单的对比. 空搜索 搜索API最简单的形式是不指定索引和类型的空搜索,它将返 ...
- 《一头扎进》系列之Python+Selenium框架设计篇4- 价值好几K的框架,呵!这个框架有点意思啊
1.简介 前面文章,我们实现了框架的一部分功能,包括日志类和浏览器引擎类的封装,今天我们继续封装一个基类和介绍如何实现POM.关于基类,是这样定义的:把一些常见的页面操作的selenium封装到bas ...
- cannot resolve symbol AppCompatActivity
记一次配置性的问题 今天复习自定义控件的时候新建一个project,生成的代码冒红,可把我给郁闷了.我知道我的配置是正确的,可是... 它出现了cannot resolve symbol AppCom ...
- 转自自己的关于落谷计数器【p1239】的题解
本蒟蒻写这道题用了两天半里大概五六个小时.(我太弱了) 然后这篇题解将写写我经历的沟沟坎坎,详细的分析一下, 但是由于它很长,因此一定还有多余的地方,比如说我的 预处理,可能比较多余.但是我觉得,信息 ...
- d3.js 入门指南
说到数据可视化,我们会行到很多优秀的框架,像echarts.highcharts,这些框架很优雅,健壮,能满足我们对可视化的大部分需求,但是缺点也很明显,就是这些框架几乎是不可定制化的,当遇到特殊的需 ...
- Python面向对象-定制方法
Python中的class可以定义许多定制方法,可以让我们方便的生成特定的类. 我们之前介绍了__slots__.__len__(),python中还有许多这样的特殊函数: __str__ >& ...
- CSS入门(背景各种属性的详解、垂直居中和过渡效果的详解、渐变效果的简单讲解、雪碧图和精灵图)
一.各种背景属性 1.background-image 属性为元素设置背景图像. 元素的背景占据了元素的全部尺寸,包括内边距和边框,但不包括外边距. 默认地,背景图像位于元素的左上角,并在水平和垂直方 ...
- ASP.NET Core 2.x 到 3.1 迁移指南
一.前言 今日(2019/12/4).NET Core 3.1 正式发布了,ASP.NET Core 3.1 随之发布,这次 3.0 到 3.1经过了两个月的短周期,并没有增加重大的功能,主要是对 3 ...