redis高级特性之事务
2015-12-16 12:15
471 查看
redis事务相比较于mysql的事务来说比较的简单并且不想mysql的事务完善,下面简单的介绍下。
在mysql中事务的四个特点原子性,一致性,隔离性,持久性。但是在redis中并没有很好的实现。在redis中我们可以通过multi来开启事务,在执行事务的过程中,我们可以保证的是一个客户端在执行命令的的过程中不会受到其他客户端的影响,在事务中如果执行多条命令的话,首先命令会被放在一个队列中,等到执行exec的时候队列中的事务会被提交。但是redis事务一个明显的缺陷是,他的原子性以及事务的回滚做的很不好,看下面的例子
redis-cli
set name hello
set age 20
multi
incr name
incr age
exec
上面的例子中,我设置了两个key,其中一个name---hello,另外的一个keyage----20,然后对两个key进行了加1的操作,但是name是不能够进行加1的,所以在执行的过程中incr name返回值是0,代表的是操作失败。但是此时我们的redis数据库仍然会将事务进行提交。最后执行的结果就是age进行了加1的操作,但是name没有进行加1的操作,这显然是不符合事务的逻辑的。事务应该是要么都执行,要么都不执行的。所以redis在这方面需要改进。
同样如果我们想要放弃我们事务队列中对数据库的修改,直接discard即可恢复。
在mysql中事务的四个特点原子性,一致性,隔离性,持久性。但是在redis中并没有很好的实现。在redis中我们可以通过multi来开启事务,在执行事务的过程中,我们可以保证的是一个客户端在执行命令的的过程中不会受到其他客户端的影响,在事务中如果执行多条命令的话,首先命令会被放在一个队列中,等到执行exec的时候队列中的事务会被提交。但是redis事务一个明显的缺陷是,他的原子性以及事务的回滚做的很不好,看下面的例子
redis-cli
set name hello
set age 20
multi
incr name
incr age
exec
上面的例子中,我设置了两个key,其中一个name---hello,另外的一个keyage----20,然后对两个key进行了加1的操作,但是name是不能够进行加1的,所以在执行的过程中incr name返回值是0,代表的是操作失败。但是此时我们的redis数据库仍然会将事务进行提交。最后执行的结果就是age进行了加1的操作,但是name没有进行加1的操作,这显然是不符合事务的逻辑的。事务应该是要么都执行,要么都不执行的。所以redis在这方面需要改进。
同样如果我们想要放弃我们事务队列中对数据库的修改,直接discard即可恢复。
相关文章推荐
- redis高级特性之主从复制
- redis 学习手册之哈希表数据类型hashes操作命令
- redis 学习手册之列表数据类型Lists操作命令
- 【原创】REDIS与MYSQL实现标签的对比
- 【原创】REDIS与MYSQL实现标签的对比
- [Python3.4]通过Redis利用BloomFilter实现数据去重
- REDIS与MYSQL实现标签的对比
- redis学习笔记整理
- redis学习 - 数据持久化
- Redis学习笔记(2) Redis基础类型及命令之一
- redis如何清除所有的key
- redis学习笔记---redis的哨兵Sentinel
- redis相关
- OS X下安装Redis及配置开机启动
- redis
- Linux下操作Redis类(基于hiredis接口)
- Redis Cluster原理
- redis 资料
- Redis系列二:Redis支持的数据类型和使用方法(一)
- Windows64安装Redis及其管理工具RedisStudio