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                    #取消监控
  • 相关阅读:
    CSUOJ 1525 Algebraic Teamwork
    CSUOJ 1531 Jewelry Exhibition
    CSUOJ 1532 JuQueen
    POJ 2195 Going Home
    hiho week 37 P1 : 二分·二分查找之k小数
    POJ 2186 Popular Cows
    ZOJ 2532 Internship
    RQNOJ PID496/[IOI1999]花店橱窗布置
    POJ 3026 Borg Maze
    laravel框架总结(五) -- 服务提供者(提及契约Contracts)
  • 原文地址:https://www.cnblogs.com/ccEmma/p/7747390.html
Copyright © 2011-2022 走看看