redis学习笔记04-事务
1.redis事务
事务实际上指的是一组命令的集合,执行时会按顺序串行的执行,中途不能加入其它命令。它用来解决批处理需求。
在redis中的基本使用如下:
>multi
ok
>incr books
QUEUED
>exec
(integer) 1
(integer) 2
multi和exec就是事务开始和结束的标志,中间就是事务的具体内容。事务的丢弃可用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-事务的更多相关文章
- Redis学习笔记(7)-事务
package cn.com; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis. ...
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- redis学习笔记-04:redis五大数据结构类型
redis的命令大全网站:http://redisdoc.com/ 一.redis五大数据类型 1.String(字符串).Hash(哈希,类似Java里的Map).List(列表).Set(集合)和 ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- redis学习笔记(3)
redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
随机推荐
- CSS 继承和优先级
CSS继承性 CSS属性继承:外层元素的样式,会被内层元素进行继承. 多个外层元素的样式,最终都会“叠加”到内层元素上. 什么样的CSS属性能被继承呢? CSS文本属性都会被继承的: color. f ...
- shell常用命令及正则辅助日志分析统计
https://www.cnblogs.com/wj033/p/3451618.html 正则日志分析统计 3 grep 'onerror' v3-0621.log | egrep -v '(\d ...
- QT之QSettings 学习
1.读写配置文件. 代码如下: //创建配置文件 QSettings iniFile(QCoreApplication::applicationDirPath()+"/test.ini&qu ...
- DNA repair HDU - 2457 AC自动机+DP
题意: 给你N个模板串,并且给你一个文本串, 现在问你这个文本串最少需要改变几个字符才能使得它不包含任何模板串. (以上字符只由A,T,G,C构成) 题解: 刚开始做这一题的时候表示很懵逼,好像没有学 ...
- SPOJ694 New Distinct Substrings
New Distinct Substrings 题目大意 给定一个字符串,求本质不同的子串个数 题解 SA常见思想:每一个子串都是某个后缀的前缀 考虑每一个后缀的贡献,首先他拥有n - sa[i]个( ...
- 转:浅析C++中的this指针
原文出处:http://blog.csdn.net/starlee/article/details/2062586 有下面的一个简单的类: class CNullPointCall { public: ...
- 小程序中template的用法
demo案例: wxml代码: <view> <text>template使用demo</text> <!-- <view wx:for="{ ...
- 在vc2008 mfcC++中使用sqlite的示例
http://owlman.org/?p=890 在C++中使用sqlite的示例 2011年8月5日admin发表评论阅读评论 最近因为工作原因,终于使我有机会腾出时间来接触了一下SQLite数据库 ...
- 修改数组中对象的key值
遇见场景:echart图表中后台返回我的数据,后台无法修改key值,但是echart渲染图表的时候,需要用 var m2R2Data= [ {value:335,name:"种类01 335 ...
- 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)[转]
上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们 ...