关闭

redis中事务(Transaction)的使用

标签: redis事务php数据库watch
26503人阅读 评论(0) 收藏 举报
分类:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,提供多种语言的API,支持多种数据存储方式。开发中一般用于缓存,队列,数据库使用。

redis事务(Transaction)说明

redis中的事务与传统关系型数据库(如mysql)的事务是不同的。

redis中的事务是一组命令的集合,事务与命令都是最小执行单位,原理是先将属于一个事务的命令发送给Redis,然后Redis一次执行这些命令。

redis的事务可以保证一个事务内的命令一次执行而不被其他命令插入影响。

redis的事务错误处理与关系型数据库事务错误处理区别

如果事务块中某一条命令出错,关系型数据库的事务会执行回滚,而redis不会执行回滚,而是会继续执行后续的命令。因为redis的事务没有关系型数据库的回滚(rollback)功能。因此需要开发者在事务执行出错时自己处理。

redis事务(Transaction)命令

1.watch
用于监视一个或多个key,如果在事务执行之前这个或(这些)key被其他命令所改动,事务将被中断。

2.unwatch
用于取消watch命令对所有key的监视。

3.multi
用于标记一个事务块的开始,之后的所有命令都存放在队列,等遇到exec命令再执行。

4.exec
用于执行事务块内所有的命令,如果命令被中断,返回false

实例

1.使用redis事务,事务正常执行

<?php
$redis = new Redis;
$redis->connect('localhost', 6379);

// 监听
$redis->watch('mykey1','mykey2');

// 开启事务块
$redis->multi();

// 事务块语句
$redis->set('mykey1', date('Y-m-d H:i:s'));
$redis->set('mykey2', time());

// 执行事务
$result = $redis->exec();

// 取消监听
$redis->unwatch();

var_dump($result);
?>

输出:

array (size=2)
  0 => boolean true
  1 => boolean true

进入redis查看这两个key的值

127.0.0.1:6379> mget "mykey1" "mykey2"
1) "2017-09-24 17:14:02"
2) "1506244442"

表示事务块语句 set mykey1,mykey2执行成功。

2.使用redis事务,事务被中断

我们模拟在事务执行过程中值被修改,因此在事务块中加入sleep延迟执行,然后在延迟的时候修改监听key的值。

<?php
$redis = new Redis;
$redis->connect('localhost', 6379);

// 监听
$redis->watch('mykey1','mykey2');

// 开启事务块
$redis->multi();

// 事务块语句
$redis->set('mykey1', date('Y-m-d H:i:s'));
$redis->set('mykey2', time());

// 延迟5秒
sleep(5);

// 执行事务
$result = $redis->exec();

// 取消监听
$redis->unwatch();

var_dump($result);
?>

在延迟的时候,进入redis,手动执行以下命令修改mykey2的值。

127.0.0.1:6379> set mykey2 123
OK

因为监听的key的值被修改,因此事务执行中止。

输出:

boolean false

进入redis查看这两个key的值

127.0.0.1:6379> mget "mykey1" "mykey2"
1) "2017-09-24 17:14:02"
2) "123"

表示事务块语句 set mykey1,mykey2没有执行。

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【Redis缓存机制】13.Java连接Redis_Jedis_事务

Jedis事务 我们使用JDBC连接Mysql的时候,每次执行sql语句之前,都需要开启事务;在MyBatis中, 也需要使用openSession()来获取session事务对象,来进行sql执...
  • Richard_Jason
  • Richard_Jason
  • 2016-12-12 15:30
  • 1275

Redis编程实践【pipeline和事务】

http://shift-alt-ctrl.iteye.com/blog/1863790  Redis或许已经在很多企业开始推广并试水,本文也根据个人的实践,简单描述一下Redis在...
  • bluetjs
  • bluetjs
  • 2016-11-06 16:04
  • 1253

Jedis对管道、事务以及Watch的操作详细解析

1、Pipeline 利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。所以...
  • liyantianmin
  • liyantianmin
  • 2016-06-08 16:21
  • 6885

redis命令详解与使用场景举例——Transaction(事务)

DISCARD取消事务,放弃执行事务块内的所有命令。 如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。 可用版本: 2.0.0+ ...
  • fuyuwei2015
  • fuyuwei2015
  • 2017-04-25 18:13
  • 544

redis的事务(transaction)详解

事务(Transaction)MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务的基础。 事务可以一次执行多个命令, 并且带有以下两个重要的保证: ● 事务是一...
  • fuyuwei2015
  • fuyuwei2015
  • 2017-04-27 18:19
  • 250

redis源码分析之事务Transaction(上)

这周学习了一下redis事务功能的实现原理,本来是想用一篇文章进行总结的,写完以后发现这块内容比较多,而且多个命令之间又互相依赖,放在一篇文章里一方面篇幅会比较大,另一方面文章组织结构会比较乱,不容易...
  • lingfenglangshao
  • lingfenglangshao
  • 2017-11-14 23:16
  • 39

redis源码分析之事务Transaction(下)

接着上一篇,这篇文章分析一下redis事务操作中multi,exec,discard三个核心命令。 原文地址:http://www.jianshu.com/p/e22615586595看本篇文章前需要...
  • lingfenglangshao
  • lingfenglangshao
  • 2017-11-14 23:16
  • 47

NoSQL之Redis---事务(transaction)命令

[不忘初心] 相信学过数据库事务的看官一定知道ACID四原则,即事物的原子性(Atomic)、一致性(Consistent)、独立性(Isolated)及持久性(Durable)。但是在Redis的事...
  • ABCD898989
  • ABCD898989
  • 2016-06-19 09:47
  • 527

NoSQL之Redis---事务(transaction)Java实现

[不忘初心] 前文中,我们介绍了通过命令行的方式调用redis命令实现事务。本文我们来介绍一下使用Java来实现redis。惯例,我们先看看准备工作有哪些: a.操作系统:windows 7 x64 ...
  • ABCD898989
  • ABCD898989
  • 2016-06-21 19:15
  • 1008

WCF中使用Transaction的例子,通过这个例子学会事务的使用

  • 2010-07-02 22:13
  • 31KB
  • 下载
    微博
    微信公众号
    微信分享公众平台-破晓领域
    破晓领域
    微信号:fdipzone-idea
    名称:破晓领域

    个人资料
    • 访问:7711567次
    • 积分:46000
    • 等级:
    • 排名:第78名
    • 原创:295篇
    • 转载:24篇
    • 译文:0篇
    • 评论:508条
    博客专栏
    最新评论