深入浅出Redis(二)高级特性:事务
第一篇中介绍了Redis是一个强大的键-值仓储,支持五种灵活的数据结构。其实,Redis还支持其他的一些高级特性:事务、公布与订阅、管道、脚本等,本篇我们来看一下事务。
127.0.0.1:6379> set balance 100
OK
127.0.0.1:6379> set debt 0
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby balance 25
QUEUED
127.0.0.1:6379> incrby debt 25
QUEUED
127.0.0.1:6379> exec
1) (integer) 75
2) (integer) 25
127.0.0.1:6379> get balance
"75"
127.0.0.1:6379> get debt
"25"
在multi命令后的其他命令,返回结果都是"QUEUED“,这些命令不会马上运行,仅仅是简单的在Server端缓存起来了。在发出exec命令后,他们才会被一起运行。或者discard命令回滚事务。
- 事务中的命令都是按着他们进入缓存队列的顺序依次运行的。在事务运行中,Redis不会受理其他client的命令(隔离性)
- 事务中的命令,或者所有运行,或者所有不运行。(原子性)
redis.multi()
balance = redis.get('balance')
if (balance < amtToSubtract) {
redis.discard()
} else {
redis.decrby('balance', amtToSubtract)
redis.incrby('debt', amtToSubtract)
redis.exec()
}
redis.watch('balance')
balance = redis.get('balance')
if (balance < amtToSubtract) {
redis.unwatch()
} else {
redis.multi()
redis.decrby('balance', amtToSubtract)
redis.incrby('debt', amtToSubtract)
redis.exec()
}
通俗点讲,watch命令就是标记一个键。假设标记了一个键,在提交事务前假设该键被别人改动过,那事务就会失败,这样的情况通常能够在程序中又一次再尝试一次。
像上面的样例,首先标记了键balance,然后检查剩余金额是否足够,不足就取消标记。并不做扣减;足够的话,就启动事务进行更新操作,假设在此期间键balance被其他人改动,那在提交事务(运行exec)时就会报错。程序中通常能够捕获这类错误再又一次运行一次。直到成功。
127.0.0.1:6379> set value 1
OK
127.0.0.1:6379> set value2 abc
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr value
QUEUED
127.0.0.1:6379> incr value2
QUEUED
127.0.0.1:6379> exec
1) (integer) 2
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get value
"2"
127.0.0.1:6379>
exec提交事务后。在运行到incr value2时错误了(数据类型不对),但事务对value的操作却是生效的。这点能够从后面的get value的返回值看到。
深入浅出Redis(二)高级特性:事务的更多相关文章
- Redis进阶实践之五Redis的高级特性
一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性 ...
- Redis进阶实践之五Redis的高级特性(转载 5)
Redis进阶实践之五Redis的高级特性 一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今 ...
- Redis高级特性---------事务与持久化与发布订阅
一.redis事务的用法 1.开启事务:multi 2.提交事务:exec ( queued只是把指令放入队列中,没有执行) 3.取消事务:discard 4.redis事务不能保证同时成功或者失 ...
- Redis的高级特性哨兵
一.哨兵介绍 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入.哨兵的核心功能是主节点的自动故障转移.下面是Redis官方文档对于哨兵功能的描述: 监控(Monitor ...
- Redis的高级特性一览
更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 应用场景 缓存系统:用于缓解数据库的高并发压力 计数器:使用Redis原子操作,用于社交网络的转发数,评论数,粉丝数 ...
- redis多实例与主从同步及高级特性(数据过期机制,持久化存储)
redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...
- 【Redis】二、Redis高级特性
(三) Redis高级特性 前面我们介绍了Redis的五种基本的数据类型,灵活运用这五种数据类型是使用Redis的基础,除此之外,Redis还有一些特性,掌握这些特性能对Redis有进一步的了解, ...
- Redis基础用法、高级特性与性能调优以及缓存穿透等分析
一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hype ...
- Redis 宝典 | 基础、高级特性与性能调优
转载:Redis 宝典 | 基础.高级特性与性能调优 本文由 DevOpsDays 本文由简书作者kelgon供稿,高效运维社区致力于陪伴您的职业生涯,与您一起愉快的成长. 作者:kelgon ...
随机推荐
- python基础一 day4 字典
增加: 结果 删: 结果: 结果: 返回值是一个元组形式的键值 改: 结果: 结果: 代码: info=inpu ...
- vue 数据没有驱动视图?
Part.1 问题 数据改变,视图却没有根据数据而改变. 原因在于,数据并不在 vue 监听范围之内,vue 只对事先在 data 中声明的变量丶对象等类型数据进行监听 Part.2 例子 < ...
- CentOS6 自己动手搭建开放NTP服务器
第一步: 1. 安装NTP服务程序: [root@host ~]# rpm -qa | grep ntp #查询是否安装ntp服务程序 [root@host ~]# yum install -y nt ...
- 如何在windows 2008 IIS7 上实现AD域的访问控制
1.服务器加入域 2.创建点站 3.对站站进行设置 3.1设置网站的连接模式 选中站点,在控制台右侧 选择 基本设置 => 选择 应用程序用户 3.2 开启访问模式 选择站点 => 身份验 ...
- 函数内部属性之arguments和this
在函数内部,有两个特殊的对象:arguments和this. 1.arguments arguments是一个类数组对象.包含着传入函数中的所有参数.但这个对象还有一个名叫callee的属性,该属性是 ...
- 【洛谷日报#75】浅谈C++指针
放入我的博客食用效果更佳(有很多oi学习资料) 1.指针基础 1.引用 C++有一个东西叫引用,引用相当于给对象(如:变量)起了另一个名字,引用必须用对象初始化,一旦初始化,引用就会和初始化其的对象绑 ...
- XML 解析 & 特殊字符报错
在xml文件中,有一些符号是具有特殊意义的,如果直接使用会导致xml解析报错,为了避免错误,我们需要将特殊的字符使用其对应的转义实体进行操作.这些字符如下 < == < > = ...
- 深入理解JavaScript的设计模式
使用适当的设计模式可以帮助你编写更好.更易于理解的代码.这样的代码也更容易维护.但是,重要的是不要过度使用它们.在使用设计模式之前,你应该仔细考虑你的问题是否符合设计模式. 当你开始一个新的项目时,你 ...
- 条款7:为多太基类声明virtual析构函数
NOTE: 1.polymorphic(多态性质的)base classes 应该声明一个virtual 析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. ...
- cherrypy & gevent patch
给cherrypy 打gevent WSGIServer的patch 1. patch Serving 类 2. 关闭python的原生WSGIServer 具体使用例子参考 我的开源项目 http ...