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 ...
随机推荐
- iOS开发之SceneKit框架--SCNNode.h
1.SCNNode简介 SCNNode是场景图的结构元素,表示3D坐标空间中的位置和变换,您可以将模型,灯光,相机或其他可显示内容附加到该元素.也可以对其做动画. 2.相关API简介 初始化方法 // ...
- /encrypt和/decrypt端点来进行加密和解密的功能
- k8s-prometheus监控
- webjars和springboot热启动
webjars WebJars将Web前端Javascript和CSS等资源打包成Java的Jar包, 以便能使Maven的依赖管理支持静态JavaScript库/CSS库,比如jQuery.layu ...
- Caffe系列1——网络文件和求解分析
1. 首先,我们先看一个完整的文件:lenet_train_test.prototxt name: "LeNet" #整个网络的名称 layer { #数据层——训练数据 name ...
- Android开发 layer-list详解
参考:https://blog.csdn.net/speverriver/article/details/80925686 挖坑,以后填坑
- 【HZOI2015】帕秋莉的超级多项式
题面 题目分析 超级模板题: 多项式乘法 多项式求逆 多项式开根 多项式求导 多项式求积分 多项式求对数 多项式求自然对数为底的指数函数 多项式快速幂 代码实现 #include<iostrea ...
- [JZOJ4640] 【GDOI2017模拟7.15】妖怪
题目 描述 题目大意 给你一堆aia_iai和bib_ibi(方便起见用的变量和上面不一样),让你搞出一个xxx(相当于题目中的ba\frac{b}{a}ab,随便推推就能知道), 使得max ...
- python Xls文档读写
1.模块安装 2.python 代码 import xlrd import xlwt import datetime def set_style(name,height,format,bold=Fal ...
- memcache课程---4、php+memcache如何让用户跨域登录
memcache课程---4.php+memcache如何让用户跨域登录 一.总结 一句话总结: 让所有服务器共用一台memcache缓存,即可达到跨域的目的 1.session跨域:修改php配置文 ...