您的位置:首页 > 数据库 > Redis

Redis入门系列之事务

2015-06-04 00:00 639 查看
摘要: 事务是指一段数据库指令要么全部完成,要么全部不执行。保持一段指令的完整性。几乎所有关系型数据库都支持事务,而nosql 很少有支持事务的,就算支持效果也很差。Redis只能算是部分支持。因为Redis不能自动rollback。

事务是指一段数据库指令要么全部完成,要么全部不执行。保持一段指令的完整性。几乎所有关系型数据库都支持事务,而nosql 很少有支持事务的,就算支持效果也很差。Redis只能算是部分支持。因为Redis不能自动rollback。

一.Redis中执行事务

1.1在Redis中事务开启指令是multi,提交事务指令是exec

localhost:6379> multi
OK
localhost:6379> set name a
QUEUED
localhost:6379> set name b
QUEUED
localhost:6379> set name d
QUEUED
localhost:6379> exec
1) OK
2) OK
3) OK


1.2当事务执行过程中出现异常的时候,Redis会继续执行下面的指令

localhost:6379> multi
OK
localhost:6379> set name b
QUEUED
localhost:6379> set name c
QUEUED
localhost:6379> set name d
QUEUED
localhost:6379> incr name
QUEUED
localhost:6379> set name e
QUEUED
localhost:6379> exec
1) OK
2) OK
3) OK
4) (error) ERR value is not an integer or out of range
5) OK
localhost:6379> get name
"e"

上面的一段事务命令可以看出来,第四条指令执行失败,但是Redis还是会执行第五条指令。所以不支持回滚的事务很危险的,很显然Redis不能用于对数据正确性一致性要求高的地方,如金融,财务。

二.Redis中watch命令

如果一段事务在操作的过程中,不允许一个key被其他事务操作。因为会出现脏数据。

watch的作用就是监视一个key,如果其发生改变,那么后面的multi exec里面的就会执行失败。

localhost:6379> watch name
OK
localhost:6379> set name a
OK
localhost:6379> multi
OK
localhost:6379> set name a
QUEUED
localhost:6379> exec
(nil)

可以看到在watch了name之后,事务中只要有操作name的命令,整个事务都不会执行。watch只能在同一个客户端中有效。

unwatch可以取消监控。

三.设置key的超时时间

localhost:6379> set name Tom
OK
localhost:6379> expire name 900
(integer) 1
localhost:6379> ttl name
(integer) 897

expire name 900 设置key的超时时间单位为秒。

ttl name 查看key还剩多少存在时间

需要注意的是key经过修改之后,超时时间需要重新设置。

localhost:6379> expire name 900
(integer) 1
localhost:6379> ttl name
(integer) 897
localhost:6379> ttl name
(integer) 787
localhost:6379> persist name
(integer) 1
localhost:6379> ttl name
(integer) -1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息