1.redis事务

事务实际上指的是一组命令的集合,执行时会按顺序串行的执行,中途不能加入其它命令。它用来解决批处理需求。

在redis中的基本使用如下:

>multi

ok

>incr books

QUEUED

>exec

(integer) 1

(integer) 2

multiexec就是事务开始和结束的标志,中间就是事务的具体内容。事务的丢弃可用discard命令,所有的事务在exec之前都不会执行。

redis的事务有以下特点:

1.全体连坐

            >set books python
ok
>multi
ok
>set a1 b1
QUEUED
>cbaafasfaf books linux
(error) ERR unknown command 'cbaafasfaf'
>set a2 b2
QUEUED
>exec
(error) EXECABORT Transaction discarded because of previous errors.
>get a1
(nil)
>get a2
(nil)

可见multi语句中,每输入一次指令都会被检测一次,当出现错误语法时会直接返回一个error,之后exec提交后会发现事务中的语句都不会被执行。

2.冤有头债有主

        >set books redis
ok
>multi
ok
>set k1 v1
QUEUED
>incr books
QUEUED
>set k2 v2
QUEUED
>exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
>get k1
"v1"
>get k2
"v2"
>get books
"redis"

可见,redis事务将正确的指令都执行了,只卡住了错误的命令。这是为什么呢?

实际上redis事务并不是一种严格的事务,只要是中间没有明显的特别明显的错误,就会将正确的指令都执行,只抛弃错误的指令。而且redis的事务也不支持回滚这种操作。

2.悲观锁和乐观锁

悲观锁即认为客户端的操作一定会引起数据混乱,为了防止数据的错误操作,在对数据操作之前会对要操纵数据所在的数据库表进行不同范围的上锁,防止误操作。

而乐观锁认为,客户端操作基本不会对数据造成影响,只对一些认为可能出问题的数据上锁。

具体操作如下:

悲观锁:利用数据库的表锁和行锁或其他锁机制实现

乐观锁:redis利用watch方法实现,其本质上也是加了把锁,当其他请求修改了被watch数据之后,事务就会执行失败,这就需要重新发起请求。需要注意的是在redis中,watch只能用在事务开始之前,否则会出错。

基本使用如下:

import redis

def key_for(user_id):
return 'account_{}'.format(user_id) def bussiness(client,user_id):
key = key_for(user_id)
while True:
client.watch(key)
# 数值加倍
value = int(client.get(key))
value *= 2
#用管道提交事务
pipe = client.pipeline(translation=True)
pipe.multi()
pipe.set(key,value)
#尝试提交事务,成功时跳出循环;失败时重新尝试。
try: pipe.exec()
break
except WatchError:
continue
return int(client.get(key)) client = redis.StructRedis()
user_id = 'abc'
client.setnx(key_for(user_id),5) #初始化
print(bussiness(client,user_id))

借用管道可以将事务中的多次I/O操作压缩成单次I/O,提高效率。在python的redis客户端中提交事务是要强制使用pipeline的。

悲观锁尽管很安全,但是在在执行时要有拿锁,操作数据,释放锁的流程,且其他的请求在这个过程只能等待。并发情况下,尤其在高并发请求时,速度是真的慢。所以它一般只适用于要对数据库做大改动或其他重要的情况下进行。

乐观锁适用于读操作为主要请求,对数据安全性要求不苛刻的情况下,可以显著提升高并发情况下的请求处理速度。

redis学习笔记04-事务的更多相关文章

  1. Redis学习笔记(7)-事务

    package cn.com; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis. ...

  2. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  3. redis学习笔记-04:redis五大数据结构类型

    redis的命令大全网站:http://redisdoc.com/ 一.redis五大数据类型 1.String(字符串).Hash(哈希,类似Java里的Map).List(列表).Set(集合)和 ...

  4. Redis:学习笔记-04

    Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...

  5. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  6. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  7. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  8. Redis学习笔记(1)——Redis简介

    一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...

  9. redis学习笔记(3)

    redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...

  10. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

随机推荐

  1. 引用第三方 chalk 模块

    第三方模块没有默认引用到我们的电脑中,我们要进行下载 chalk 这个包是为了使输出不再单调,添加文字背景什么的,改变字体颜色什么的, npm install chalk //只需要写文件包名,不需要 ...

  2. 设置IDEA自动提示补全代码,关于idea自动补全的详细设置。

    在IDEA中,默认的代码自动提示不够智能,现在配置成更加智能的方式. File-Settings-Editor-General-Code Completion中 把最上面的大小写敏感度改成none,下 ...

  3. 新增加的html里的标签元素,该元素作为事件,js获取不到id的问题

    if(flag==0){                var p = document.createElement("p");                  var text ...

  4. IIR滤波器数字频带转换

    <DSP using MATLAB>(Ingle & John Proakis)3ed,书中表8.2似乎不对. <Discrete Time signal processin ...

  5. 使用Flume+Kafka+SparkStreaming进行实时日志分析

    每个公司想要进行数据分析或数据挖掘,收集日志.ETL都是第一步的,今天就讲一下如何实时地(准实时,每分钟分析一次)收集日志,处理日志,把处理后的记录存入Hive中,并附上完整实战代码 1. 整体架构 ...

  6. @Component 和 @Bean 的区别

    Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean.完成这两个动作有三种方式,一种是使用自动配置的方式.一种是使用JavaConfig的方式,一种就是使用XML配置的方 ...

  7. WCF服务编程-基础

    WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...

  8. MyEclipse使用总结——Maven项目如何启动运行发布到tomcat中[转]

    前面两篇文章: 新建maven框架的web项目 以及 将原有项目改成maven框架 之后,我们已经有了maven的项目 那么 maven项目到底怎么启动呢 如果我们直接在myeclipse中按以前的启 ...

  9. Python学习day43-数据库(多表关系)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  10. Python学习day08-python进阶(2)-内置方法

    Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法       xxxxxxxxxx 2         1 hobby_list ...