1. Redis 高级特性 —— 事务
事务概念
Redis 中的事务 (transaction)是一组命令的集合。事务同命令一样是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
事务的原理是先将属于一个事务的命令发送给 Redis,然后再让 Redis 依次执行这些命令。
事务命令
命令 | 说明 |
---|---|
watch key[key…] | 锁定key,直到执行了multi/exec命令 |
multi | 标记一个事务块开始 |
exec | 执行所有multi之后发的命令 |
discard | 丢弃所有multi之后发的命令 |
事务使用
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 1
QUEUED
127.0.0.1:6379> set b 2
QUEUED
127.0.0.1:6379> set c 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379>
multi 标记一个事务的开始,表示之后发送的命令都属于同一个事务,而 exec 命令则告诉 Redis 将等待执行的事务队列中的所有命令(即刚才返回 QUEUED 的命令)按照发送顺序依次执行。exec 命令的返回值是事务命令的返回值组成的列表,返回值顺序和命令的顺序相同。
Redis 会保证一个事务中的命令要么都执行,要么都不执行。如果在执行 exec 命令之前客户端断线了那么 Redis 会自动清空事务队列,事务中的所有命令都不会执行;而如果客户端执行了 exec 命令后断线也没有关系,Redis 已经记录了所有要执行的命令。
错误处理
如果 Redis 事务中一个命令发生错误,那么其它的命令还会执行吗?我们主要看两种错误:
-
语法错误
只要事务中有一个命令的语法发生错误,那么整个事务中的命令都不会执行。
-
运行错误
运行错误是指在执行命令时出现的错误,这种错误在实际执行之前是无法发现的,当事务中出现这种运行错误时,其它命令仍然会继续执行的。
Redis 事务不支持关系型数据库事务提供的回滚功能。
watch 命令
watch 命令可以监控一个或者多个键,一旦其中有一个键被修改或删除,之后的事务就不会执行。监控一直持续到 exec 命令 (事务中的命令是在 exec 命令之后执行的,所以在 multi 命令之后可以修改 watch 监控的键值)
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> watch a
OK
127.0.0.1:6379> set a 2
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 3
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get a
"2"
127.0.0.1:6379>
2. Redis 高级特性 —— 过期时间
Redis 使用 expire 命令设置一个键的过期时间,到时间后 Redis 会自动删除它。expire 命令的使用方法为
expire key seconds
其中 seconds 表示键的过期时间,单位为秒,expire 命令返回 1 表示设置成功,返回 0 表示键不存在或者设置失败。
127.0.0.1:6379> expire b 10
(integer) 1
127.0.0.1:6379> expire z 10
(integer) 0
127.0.0.1:6379>
ttl 命令用于查询一个键还有多久会被删除,返回值是键的剩余时间,单位为秒;
当键不存在时返回 -2 ;当键没有过期时间即永久存在,那么返回值为 -1
127.0.0.1:6379> keys *
1) "num"
2) "set"
3) "student"
4) "a"
5) "d"
6) "list"
7) "c"
8) "set_a"
9) "set_b"
127.0.0.1:6379> expire num 10
(integer) 1
127.0.0.1:6379> ttl num
(integer) 6
127.0.0.1:6379> ttl num
(integer) 4
127.0.0.1:6379> ttl num
(integer) 2
127.0.0.1:6379> ttl num
(integer) -2
127.0.0.1:6379> keys *
1) "set"
2) "student"
3) "a"
4) "d"
5) "list"
6) "c"
7) "set_a"
8) "set_b"
127.0.0.1:6379>
persist 命令用于设置取消键的过期时间,如果过期时间被成功清除则返回 1;否则返回 0
127.0.0.1:6379> expire d 20
(integer) 1
127.0.0.1:6379> ttl d
(integer) 17
127.0.0.1:6379> persist d
(integer) 1
127.0.0.1:6379> ttl d
(integer) -1
127.0.0.1:6379>
除过使用 persist 命令外,使用 set 命令为键赋值也会清除键的过期时间。