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. python字典的常用操作,数据类型划分

    一.数据类型划分之一 可分为:可变数据类型,不可变数据类型 不可变数据类型:元祖,布尔值(Bool),数值 int ,字符串 str               可哈希 可变数据类型:  list,d ...

  2. Berlin Programming Contest 2004 Heavy Transportation /// dijkstra oj22604

    题目大意: 输入t:t为样例数 每个样例输入n,m:n 为顶点个数 m 为路径数 接下来m行  每行输入 u v w :从 u 点到 v 点的路承重为 w 输出 车子若想通过 1~n的最短路 车重需限 ...

  3. Matlab AlexNet 识别花

    1. 首先,你要又并行计算的工具箱,在插件选项里面找到,安装即可 2. 下载训练的数据集,采用matlab演示的材料即可 https://matlabacademy-content.mathworks ...

  4. 【默默努力】react-drag-grid

    先放项目地址:https://github.com/Bilif/react-drag-grid 项目运行效果 感谢无私开源的程序员 先看项目入口文件 //index.js import React f ...

  5. Android开发 SpannableString开发详解

    前言 SpannableString,是google提供用来处理富文本的功能类.支持很多文本内容的效果变化.另外,它也是Android实现富文本编辑器的关键. 关键API详解 String conte ...

  6. js实现把多个数据分成3个一组

    主要代码: var stuCount = res.data; if (stuCount.length>0){ var objList = new Object(); var arr = new ...

  7. JavaWeb开发购物车设计总结

    一. 实体类设计 图书实体类 public class Book { private String id; private String name; private String author; pr ...

  8. 【JZOJ3238】【BZOJ3482】超空间旅行

    description 在遥远的未来,行星之间的食品运输将依靠单向的贸易路线.每条路径直接连接两个行星,且其运输时间是已知的. 贸易商协会打算利用一项最近发现的新技术--超空间旅行,以增加一些新的航线 ...

  9. python3快速安装

    linux环境快速安装python3   之前在linux上安装python3的时候,为了让不影响linux环境原有的python2的环境,选择的方法都是下载对应的linux环境的python包,不过 ...

  10. Android之GridLayout网格布局

    1.相关属性 GridLayout网格布局是4.0之后引入的布局方式! android:columnCount="4" //设置列数(4列) android:rowCount=&q ...