美文网首页
渣翻Redis基础命令学习 (上)

渣翻Redis基础命令学习 (上)

作者: 杨酥饼 | 来源:发表于2017-05-03 14:58 被阅读0次

    最近老板推荐了一个网站:http://try.redis.io/
    在这个网站上可以直接使用Redis的一些基础的命令,这样不用自己安装配置数据库了,对于初学者迅速上手Redis很有帮助。
    这个网站也附带了最基础的教程,接下来的几篇文章我会尝试翻译这些基础教程。

    对键值对的赋值SET, 取值GET, 删除DEL

    SET server:name "fido"
    GET server:name => "fido"
    
    SET server:name "dido"
    GET server:name => "dido"
    
    SETNX server:name "fido"
    GET server:name => "dido"
    
    SETNX new:server:name "fido"
    GET new:server:name => "fido"
    
    DEL server:name => 1
    DEL server:name => 0
    GET server:name => (nil)
    

    redis键值都是全是string,返回空为null/nil,返回布尔值为1/0. SETNX(SET-if-not-exists)如果key不存在则赋值

    原子增加键值

    SET connections 10
    INCR connections => 11
    INCR connections => 12
    DEL connections
    INCR connections => 1
    GET connections => 1
    

    INCR(increment), 为给定的key的值增1,前提是那个值本身必须是个整数,即使redis本身存储的是string。如果给定的key在库中并不存在,就会创建一个键为给定的key,值为0的键值对,然后再增1。

    为什么要做这样一个简单的运算符呢,即使用代码实现也是非常简单的两行,如:

    x = GET count
    x = x + 1
    SET count x
    

    这样似乎没有问题呢。可这是在一个客户端操作这个键值对的情况下。如果有多个客户端同时操作这个值,就会出现问题:

    1. 小明的代码读取了count的值为10,赋给了x.
    2. 同时小红的代码也读取了count的值,赋给了x.
    3. 小明将x的新值11赋给了count.
    4. 小红将x的新值11赋给了count.

    我们本愿是count的值应该是12,可现在只有了11了,明明操作了两次,为什么会这样?在高并发的场景下,这种情况很普遍,重新赋值时间即使很短,也不能保证不会出问题啊。所以应该使用原子操作符,直接对数据库进行细粒度的操作。类似这种原子操作符,reids多了去。

    设置key过期

    redis可以设置一个key的保存时间,过期失效。使用EXPIRE命令设置,搭配TTL命令查询。

    SET resource:lock "Redis Demo"
    EXPIRE resource:lock 120
    

    于是这个key resource:lock只会存在120秒,你可以用TTL命令查询这个key剩余的存在时间:

    TTL resource:lock => 113
    // after 113s
    TTL resource:lock => -2 
    

    返回-2代表key已经不存在,返回-1代表此key不会过期。注意如果你再次SET这个key的值,那么过期时间也随之消失。

    SET resource:lock "Redis Demo 1"
    EXPIRE resource:lock 120
    TTL resource:lock => 119
    SET resource:lock "Redis Demo 2"
    TTL resource:lock => -1
    

    生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SETGETSET 命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变。

    比如说,对一个 key 执行 INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命令,这类操作都不会修改 key 本身的生存时间。

    另一方面,如果使用 RENAME 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样。

    RENAME 命令的另一种可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key ,因此,新的 another_key 的生存时间也和原本的 key 一样。

    使用 PERSIST 命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持久的』(persistent) key 。

    EXPIREAT

    EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置生存时间。

    不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。

    redis> SET cache www.google.com
    OK
    
    redis> EXPIREAT cache 1355292000     # 这个 key 将在 2012.12.12 过期
    (integer) 1
    
    redis> TTL cache
    (integer) 45081860
    

    相关文章

      网友评论

          本文标题:渣翻Redis基础命令学习 (上)

          本文链接:https://www.haomeiwen.com/subject/jggktxtx.html