Redis整理第三波(生存时间事务管理)
Posted 林夕Emma
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis整理第三波(生存时间事务管理)相关的知识,希望对你有一定的参考价值。
expire 设置生存时间
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即到期后数据销毁。
TTL查看key的剩余时间,当返回值为-2时,表示键被删除。
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以毫秒为单位,返回 key 的剩余生存时间。
注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
127.0.0.1:6379> flushall OK 127.0.0.1:6379> set bomb tnt OK 127.0.0.1:6379> expire bomb 10 (integer) 1 127.0.0.1:6379> ttl bomb (integer) 5 127.0.0.1:6379> ttl bomb (integer) 3 127.0.0.1:6379> ttl bomb (integer) 3 127.0.0.1:6379> ttl bomb (integer) 2 127.0.0.1:6379> ttl bomb (integer) 1 127.0.0.1:6379> ttl bomb (integer) -2 127.0.0.1:6379> ttl bomb (integer) -2 127.0.0.1:6379>
persist 重新设置值
设置新的数据时需要重新设置该key的生存时间。重新设置值也会清除生存时间。
127.0.0.1:6379> set bomb tnt OK 127.0.0.1:6379> expire bomb 60 (integer) 1 127.0.0.1:6379> ttl bomb (integer) 49 127.0.0.1:6379> persist bomb (integer) 1 127.0.0.1:6379> ttl bomb (integer) -1 127.0.0.1:6379>
pexpire
设置生存时间为毫秒,可以做到更精确的控制。
127.0.0.1:6379> set bomb tnt OK 127.0.0.1:6379> pexpire bomb 10000 (integer) 1 127.0.0.1:6379> ttl bomb (integer) 6 127.0.0.1:6379> ttl bomb (integer) 3 127.0.0.1:6379> ttl bomb (integer) -2 127.0.0.1:6379>
事务管理
redis是单线程时,提交命令时,其它命令无法插入其中,轻松利用单线程实现了事务的原子性。
那如果执行多个redis命令呢?就没有办法保证事务啦,
于是redis有下列相关的redis命令来实现事务管理。
multi 开启事务
exec 提交事务
discard 取消事务
watch 监控,如果监控的值发生变化,则提交事务时会失败
unwatch 去掉监控
Redis保证一个事务中的所有命令要么都执行,要么都不执行。
如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。
而 一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。
exec提交事务
例如:模拟转账,王有200,张有700,张给王转100。过程如下:
127.0.0.1:6379> set w 200 OK 127.0.0.1:6379> set z 700 OK 127.0.0.1:6379> mget w z #mget:一次取多值 1) "200" 2) "700" 127.0.0.1:6379> multi OK 127.0.0.1:6379> decrby z 100 #decrby 设置递减步长,默认的递减步长为1
QUEUED #注意此命令根本没有执行,而是把其放在一个队列中
127.0.0.1:6379> incrby w 100 #设置递增步长,默认的递增步长是1
QUEUED
127.0.0.1:6379> mget w z QUEUED 127.0.0.1:6379> get w #同时,这些相关的变量也不能再读取 QUEUED 127.0.0.1:6379> get z QUEUED 127.0.0.1:6379> exec 1) (integer) 600 2) (integer) 300 3) 1) "300" 2) "600" 4) "300" 5) "600" 127.0.0.1:6379> mget w z 1) "300" 2) "600" 127.0.0.1:6379>
如果有错误命令,自动取消
127.0.0.1:6379> mget w z 1) "300" 2) "600" 127.0.0.1:6379> multi #开启事务 OK 127.0.0.1:6379> get w QUEUED 127.0.0.1:6379> set w 100 QUEUED 127.0.0.1:6379> abc (error) ERR unknown command ‘abc‘ #错误命令 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get w "300" 127.0.0.1:6379>
discard取消事务
redis事务太简单,没有回滚,而只有取消。
discard 命令用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态,
最后返回字符串 OK 给客户端, 说明事务已被取消
127.0.0.1:6379> mget z w 1) "600" 2) "300" 127.0.0.1:6379> multi OK 127.0.0.1:6379> incrby z 100 QUEUED 127.0.0.1:6379> discard OK 127.0.0.1:6379> get z "600" 127.0.0.1:6379> exec (error) ERR EXEC without MULTI
秒杀
客户端1: 127.0.0.1:6379> clear 127.0.0.1:6379> set ticket 1 OK 127.0.0.1:6379> set money 0 OK 127.0.0.1:6379> watch ticket #乐观锁,对值进行观察,改变则事务失败 OK 127.0.0.1:6379> multi #开启事务 OK 127.0.0.1:6379> decr ticket #用于value值自减 QUEUED 127.0.0.1:6379> incrby money 100 QUEUED 客户端2:还没等客户端1提交事务,此时客户端2把票买到了。 127.0.0.1:6379> get ticket "1" 127.0.0.1:6379> decr ticket (integer) 0 客户端1: 127.0.0.1:6379> exec (nil) #执行事务,失败 127.0.0.1:6379> get ticket "0" 127.0.0.1:6379> unwatch #取消监控
以上是关于Redis整理第三波(生存时间事务管理)的主要内容,如果未能解决你的问题,请参考以下文章