Redis数据库事务操作的简单例子

一.Redis自带事务机制

Redis事务通过MULTI 、 EXEC 、 DISCARD 、WATCH和UNWATCH命令操作,过程如下:
通过MULTI 开启事务,然后添加任意条命令到队列,通过EXEC 执行队列命令,通过DISCARD 放弃事务,通过WATCH提供锁机制,通过UNWATCH取消对key的监控。

例1:普通用法

127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr aaa
QUEUED
127.0.0.1:6379> incr bbb
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1

例2:放弃事务

127.0.0.1:6379> set aaa 1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr aaa
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get aaa
"1"

例3:WATCH锁机制(如下,如果被监控的key在exec前被修改了,则事务失败)

127.0.0.1:6379> watch aaa
OK
127.0.0.1:6379> set aaa 100
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set aaa 200
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get aaa
"100"

例4:Redis会忽略入队失败的命令或错误的命令

127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr b
QUEUED
127.0.0.1:6379> set c 1 2
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (error) ERR syntax error
127.0.0.1:6379> get b
"1"
127.0.0.1:6379> get c
(nil)

如上可见,Redis为了保证高效和快速并不支持回滚(rollback),但提供了脚本实现事务

二.使用Lua脚本实现事务

Redis可调用Lua解析器去运行脚本,Redis会保证脚本以原子性方式运行,执行多条命令还可减少网络开销,但是执行运行时间很长脚本可不是什么好主意。
通过EVAL命令去执行Lua脚本,通过redis.call()函数来调用redis命令。(详情见redis文档)
例1:eval和redis.call使用
127.0.0.1:6379> eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK
127.0.0.1:6379> get foo
"bar"

时间: 2024-09-20 17:33:22

Redis数据库事务操作的简单例子的相关文章

Laravel 5.2数据库安装配置及简单例子

1.简介 Laravel 让连接多种数据库以及对数据库进行查询变得非常简单,不论使用原生 SQL.还是查询构建器,还是 Eloquent ORM.目前,Laravel 支持四种类型的数据库系统: MySQL Postgres SQLite SQL Server 配置 Laravel 让连接数据库和运行查询都变得非常简单.应用的数据库配置位于config/database.php.在该文件中你可以定义所有的数据库连接,并指定哪个连接是默认连接.该文件中提供了所有支持数据库系统的配置示例. 默认情况

REDIS数据库中批量删除KEY例子

Redis server went away 查看系统日志文件时发现每天定时有该错误抛出: PHP Fatal error:  Uncaught exception 'RedisException' with message 'Redis server went away' 抛出该问题的脚本为统计脚本,需要读取前一天数据并入库,最初以为是REDIS读取太频繁造成的,但将数据导到测试机后执行脚本发现不会出现该情况,仔细调试发现手动执行时有一行代码没有执行,若执行该行则十分缓慢.该行代码为: $Re

php文件操作的简单例子

 代码如下 复制代码 //获取文件的主要信息. $file = "data.txt"; if(is_dir($file)) {     echo "文件 $file 是个目录";     echo "<br/>"; } else {     echo "文件 $file 不是目录";     echo "<br/>"; } if(is_file($file)) {     echo

phalapi-进阶篇4(notrom进阶以及事务操作)

phalapi-进阶篇4(notrom进阶以及事务操作) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 写本篇教程的起因是在于在交流的时候有位童鞋提出了fetchPairs有BUG,原来一直没有仔细的了解过notorm的细节,趁这次机会主要把notorm之中的一些方便快捷的操作简单的说明一下,以及对与事务操作做一些我自己的简介以及使用notorm如何实现. 附上: 官网地址:http://www.phalapi.net/ 开源中国Git地址:h

Android开发中的数据库事务用法分析_Android

本文实例讲述了Android开发中的数据库事务用法.分享给大家供大家参考,具体如下: 在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的. 首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度. 其次是保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚. 如果您喜欢使用其他平台(如PHP + MySQL),代码通常在一个功能强大的服务器上运行,一般不会被意外中止,但在android平台上,您将会因为

Android开发中的数据库事务用法分析

本文实例讲述了Android开发中的数据库事务用法.分享给大家供大家参考,具体如下: 在android应用程序开发中,在使用到数据库的时候,事务处理是非常重要的. 首先Android数据库操作(特别是写操作)是非常慢的,将所有操作打包成一个事务能大大提高处理速度. 其次是保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚. 如果您喜欢使用其他平台(如PHP + MySQL),代码通常在一个功能强大的服务器上运行,一般不会被意外中止,但在android平台上,您将会因为

php实现redis数据库指定库号迁移的方法

 这篇文章主要介绍了php实现redis数据库指定库号迁移的方法,涉及对于redis数据库的操作技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php实现redis数据库指定库号迁移的方法,分享给大家供大家参考.具体如下: redis普通的数据库迁移,只能整个redis save,或者利用主从,当然也可以安装一个redis-dump,不过比较麻烦,这里提供一种php的脚本,实现指定库号的迁移,其实也就是遍历根据存储类型,读出来,插入新库,效果是这样: 代码如下: [root@

07_NoSQL数据库之Redis数据库:Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存

 事务处理 Redis对事务的支持目前还比较简单.Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令.当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令. 127.0.0.1:6379> get age (nil) 127.0.0.1:6379> multi OK                

数据库访问简单实现---edainfo-model(三)——简单例子

model|访问|数据|数据库 下面就正式来讲一下开发步骤:首先,在Tomcat5.X下建一个jdbc/edainfo的数据源,数据库可以是oracle.sql server.mysql.表的结构如下:CREATE TABLE example (id varchar(13) NOT NULL ,name varchar(50) NULL ,address varchar(50) NULL ) ON [PRIMARY]其中,id为主键.datasource.xml内容如下:<?xml versio