zoukankan      html  css  js  c++  java
  • 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                    #取消监控
  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/ccEmma/p/7747390.html
Copyright © 2011-2022 走看看