redis的事务(简单介绍)
1、简单描述
redis对事务的支持目前还是比较简单。redis只能保证一个client发起的事务中的命令是可以连续的执行,而中间不会插入其他client的命令。由于redis是但现场来处理所有client的请求的,所以这种事务的实现还是容易的。
2、相关操作
1)mulit命令:发起事务。
2)exec命令:收到此命令后,redis会执行client开启事务后发来的一连串的命令,并返回所有命令的执行结果。
一般来说,redis接收到client发来的命令后是马上处理并返回结果,但是当接收到multi命令时,redis会让这个client的连接进入一个事务的上下文,该连接发来的后续命令并不是立即执行,而是放到队列里面,直到收到exec命令就开始执行队列中的命令,执行完后把结果发给client,然后此连接就关闭事务上下文。

3)discard命令:取消事务处理。比如multi命令发出后,操作了一些命令,在执行exec前遇到问题想退出事务,可以用这个discard命令,那么multi发起之后的所有命令都不会被执行。队列会被清空掉,事务上下文也会关闭。

【注意】multi之后的多个命令,如果有命令执行的结果是出错的,不影响后续的命令的执行。

【注意】上面截图的列子可以看到事务中有命令操作失败的,但是没有回滚,这是redis事务的一个缺陷。
4)乐观锁(watch命令)
在事务执行前可以先watch一些key,如果这些key的值没有变化,那么可以执行mulit的命令,如果有变化,则事务会退出,exec操作会返回nil。
【注意】watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被清空。exec和discard以及unwatch都可以清除连接中的监视。
3、小结
1)虽说redis事务在本质上也相当于序列化隔离级别的了,但是由于事务上下文的命令只排队并不会立即执行,所以事务中的写操作不能依赖事务中的读操作结果;
2)在php中可以使用phpredis扩展。如果使用了multi,代码中不能够对之后的命令比如 get命令的结果进行处理,因为get命令会返回一个句柄,而不是返回get到的key的值,因为multi之后的命令会被放在队列中。
3)事务是没有回滚功能,部分命令执行失败,不影响其他的命令。
4)如果事务操作过程中,redis挂了,会导致部分操作成功,部分失败。如果用aof方式做持久化,redis会用write操作写入整个事务内容,但是这样还是有可能只有一部分的事务写入了磁盘,redis重启的时候检测到这种情况,然后失败退出。要使用redis-check-aof工具来修复,会删除写入的这部分的事务,然后重启才能成功。
redis的事务(简单介绍)的更多相关文章
- redis数据库的简单介绍
NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 NoSQL的世 ...
- Redis持久化的简单介绍
Redis的强大功能很大程度上是由于其将所有数据都存储在内存中,为了使Redis在重启后仍能保证数据不丢失,需要将数据从内存中以某种形式持久化到硬盘中. Redis支持两种方式的持久化,一种是RDB方 ...
- Redis缓存数据库简单介绍
\ 1.什么是redis redis是一种基于内存的高性能键值型数据库(key-value),属于NoSQL,和 Memcached 类似: 从内存读取速度为110000次/s,写入内存速度为8100 ...
- Redis的简单介绍及在Windows下环境搭建
简单介绍 1,Redis是什么 最直接的还是看官方的定义吧. Redis is an open source (BSD licensed), in-memory data structure stor ...
- Python redis 简单介绍
Python redis 简单介绍 1.安装 终端输入: pip(or)pip3.6 install redis 安装成功 2.哈哈,发现我并没有redis服务可以访问,所以到这里,在本机安装了red ...
- 9、redis之事务2-Jedis的八种调用方式(事务、管道、分布式)介绍
1.普通同步 @Test public void test1Normal() { Jedis jedis = new Jedis("localhost"); long start ...
- Redis简单介绍
redis简单介绍 Redis VS key-value缓存产品 Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重新启动的时候能够再次载入进行使用. Redis不只支持简单的key-va ...
- Redis实战——简单介绍
出自:https://www.cnblogs.com/moonlightL/p/7364107.html Redis简单介绍 Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能, ...
- Redis主从复制简单介绍
由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分 ...
随机推荐
- windows中更换Jdk版本不生效
本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装jdk1.6前,执行java -version得到 C:\Users\liuxi ...
- C#中泛型之Dictionary
1.命名空间:System.Collections.Generic(程序集:mscorlib)2.描述: 1).从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组 ...
- ANDROID基础ACTIVITY篇之ACTIVITY的生命周期(二)
除了Activity的七大生命周期方法外外,还有两个相当重要的方法需要大家熟记那就是onSavelnstanceState()和onRestoreinstanceState(). 那么什么时候会调用这 ...
- 如何用while循环 输出一个九九乘法表
方法一 i = 1 while i < 10: k = 1 while k <= i: print('%d*%d=%2d '% (i,k,i*k),end='') #end='' 表示不换 ...
- [动态规划]P1004 方格取数
---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...
- 数据库—Mysql
今天跟大家来聊聊Mysql,首先介绍一下它的历史: Mysql是一个关系型数据库管理系统,最先由瑞典的MySQL AB公司开发,后来被sun公司收购,后因sun公司又被Oracle公司收购,致使MyS ...
- 条件注释判断IE版本
在学习Bootstra的时候看到这么一句话, <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media ...
- Innodb中的锁
Innodb中的锁 共享锁和排它锁(Shared and Exclusive Locks)共享锁和排它锁是行级锁,有两种类型的行级锁 共享锁(s lock)允许持有锁的事务对行进行读取操作 排它锁(x ...
- POJ3083 Children of the Candy Corn(Bfs + Dfs)
题意:给一个w*h的迷宫,其中矩阵里面 S是起点,E是终点,“#”不可走,“.”可走,而且,S.E都只会在边界并且,不会在角落,例如(0,0),输出的话,每组数据就输出三个整数,第一个整数,指的是,以 ...
- docker学习(一)
docker的安装 (一)环境要求: 容器需要管理工具.runtime 和操作系统,选择如下: 1.管理工具 - Docker Engine 2.runtime - runc 3.操作系统 (二)安装 ...