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 事务(悲观锁和乐观锁)的更多相关文章

  1. 悲观锁 vs 乐观锁 vs Redis

    企业面对高并发场景采用的方案. 比如 产品抢购高并发时的超发现象. 1 悲观锁悲观锁 需要数据库本身提供支持(Oracle和MySQL都是支持的).实现细节:当前 数据库事务 读取到产品后, 就将目标 ...

  2. 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  3. 第36讲 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景

    在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...

  4. mysql-mysql悲观锁和乐观锁

    1.mysql的四种事务隔离级别 I. 对于同时运行多个事务,当这些事务访问数据库中的相同数据时,如果没有采取必要的隔离机制,就会导致各种并发问题. (1)脏读: 对于两个事物 T1, T2, T1 ...

  5. Hibernate解决高并发问题之:悲观锁 VS 乐观锁

    高并发问题是程序设计所必须要解决的问题,解决此类问题最主要的途径就是对对程序进行加锁控制.hibernate对加锁机制同样做出了实现,常用加锁方式为悲观锁和乐观锁.悲观锁指的是对数据被外界(包括本系统 ...

  6. mysql的锁--行锁,表锁,乐观锁,悲观锁

    一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...

  7. 025 hibernate悲观锁、乐观锁

    Hibernate谈到悲观锁.乐观锁,就要谈到数据库的并发问题,数据库的隔离级别越高它的并发性就越差 并发性:当前系统进行了序列化后,当前读取数据后,别人查询不了,看不了.称为并发性不好 数据库隔离级 ...

  8. Mysql锁机制--乐观锁 & 悲观锁

    Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...

  9. Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...

  10. MySQL学习笔记(四)悲观锁与乐观锁

    恼骚 最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁 在TP5直接通过lock(true),用于数据库的锁机制 Db::name('p ...

随机推荐

  1. Django对DateTimeField时间字段查询QuerySet为空的解决方案

    今天在用的Django中的filter()方法对DateTimeField字段查询时碰到了问题,抓耳挠腮一下午,终于解决了,我觉得花了一下午的时间怎么着也得记录下吧(无语)...... 问题描述 : ...

  2. docker-compose编排参数详解

    一.前言 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用YAML文件来配置应用程序的服务.然后,使用单个命令,您可以从配置中创建并启动所有服务. C ...

  3. vue之新手使用

    vue中文网站:https://cn.vuejs.org/v2/guide/installation.html  包含了安装.使用.api.视频. 一. 什么是 Vue Vue 是一个前端框架,特点是 ...

  4. DHCP服务相关实验

    一.DHCP 相关介绍 1.dhcp服务相关 软件名: dhcp #DHCP服务软件包 dhcp-common #DHCP命令软件包(默认已安装) 服务名: dhcpd #DHCP服务名 dhcrel ...

  5. d3.js 共享交换平台demo

    今天在群里遇到一张图  遂来玩一玩,先来上图!! 点击相应按钮,开关线路,此项目的重点是计算相应图形的位置,由于是个性化项目就没有封装布局.好了直接上代码. <!DOCTYPE html> ...

  6. UiPath Platform注册 登录 及 访问 Orchestrator

    相关步骤: 1.https://platform.uipath.com/portal_/cloudrpa 注册 及 登录 2. Login后 通过Services 连接 访问 UiPath Orche ...

  7. java基础练习题

    1变量.运算符和类型转换:1.1手动输入一个学生的成绩,对这个成绩进行一次加分,加当前成绩的20%,输出加分后成绩 Scanner scan = new Scanner(System.in); Sys ...

  8. MySQL MHA /usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted

    在公司随便找3台测试机搭个MHA,下面这个问题折腾了三天,之前没遇到过,查了OS版本发现一致,可能是不同人弄的OS吧,知道是cpan的问题就是搞不定,郁闷...[root@test247 ~]# ma ...

  9. 微言Netty:分布式服务框架

    1. 前言 几年前,我就一直想着要设计一款自己的实时通讯框架,于是出来了TinySocket,她是基于微软的SocketAsyncEventArgs来实现的,由于此类提供的功能很简洁,所以当时自己实现 ...

  10. 一起学Spring之AOP

    概述 在软件开发中,我们重点关注的是业务逻辑代码,但在实际开发中,需要写的代码却不仅仅是业务逻辑,还需要处理记录日志,异常处理,事务控制等一些与业务无关的事情.而且这些代码也是服务端必须的,类似这样的 ...