美文网首页
Redis常用命令

Redis常用命令

作者: one_zheng | 来源:发表于2018-06-06 23:26 被阅读6次

    Key(键)

    1. DEL

    时间复杂度:
    O(N), N 为被删除的 key 的数量。
    删除单个字符串类型的 key ,时间复杂度为O(1)。
    删除单个列表、集合、有序集合或哈希表类型的 key ,时间复杂度为O(M), M 为以上数据结构内的元素数量。

    #  删除单个 key
    
    redis> SET name huangz
    OK
    
    redis> DEL name
    (integer) 1
    
    
    # 删除一个不存在的 key
    
    redis> EXISTS phone
    (integer) 0
    
    redis> DEL phone # 失败,没有 key 被删除
    (integer) 0
    
    
    # 同时删除多个 key
    
    redis> SET name "redis"
    OK
    
    redis> SET type "key-value store"
    OK
    
    redis> SET website "redis.com"
    OK
    
    redis> DEL name type website
    (integer) 3
    

    2.·EXISTS

    时间复杂度:
    O(1)

    redis> SET db "redis"
    OK
    
    redis> EXISTS db
    (integer) 1
    
    redis> DEL db
    (integer) 1
    
    redis> EXISTS db
    (integer) 0
    

    3. EXPIRE

    为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。

    PEXPIRE
    EXPIRE 命令的作用类似,但是它以毫秒为单位设置key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。

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

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

    PEXPIREAT
    它以毫秒为单位设置 key 的过期 unix 时间戳

    redis> SET cache_page "www.google.com"
    OK
    
    redis> EXPIRE cache_page 30  # 设置过期时间为 30 秒
    (integer) 1
    
    redis> TTL cache_page    # 查看剩余生存时间
    (integer) 23
    
    redis> EXPIRE cache_page 30000   # 更新过期时间
    (integer) 1
    
    redis> TTL cache_page
    (integer) 29996
    
    redis> EXPIREAT cache 1355292000     # 这个 key 将在 2012.12.12 过期
    (integer) 1
    
    redis> TTL cache
    (integer) 45081860
    

    4.·RENAME

    RENAME key newkey

    将 key 改名为 newkey 。
    当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
    当newkey已经存在时, RENAME 命令将覆盖旧值。

    # key 存在且 newkey 不存在
    
    redis> SET message "hello world"
    OK
    
    redis> RENAME message greeting
    OK
    
    redis> EXISTS message               # message 不复存在
    (integer) 0
    
    redis> EXISTS greeting              # greeting 取而代之
    (integer) 1
    
    
    # 当 key 不存在时,返回错误
    
    redis> RENAME fake_key never_exists
    (error) ERR no such key
    
    
    # newkey 已存在时, RENAME 会覆盖旧 newkey
    
    redis> SET pc "lenovo"
    OK
    
    redis> SET personal_computer "dell"
    OK
    
    redis> RENAME pc personal_computer
    OK
    
    redis> GET pc
    (nil)
    
    redis:1> GET personal_computer      # 原来的值 dell 被覆盖了
    "lenovo"
    

    5. SORT

    返回或保存给定列表、集合、有序集合 key 中经过排序的元素。

    排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。

    一般 SORT 用法

    最简单的 SORT 使用方法是 SORT key DESC:

    • SORT key返回键值从小到大排序的结果。
    • SORT key DESC返回键值从大到小排序的结果。

    假设 today_cost列表保存了今日的开销金额, 那么可以用 SORT 命令对它进行排序:

    # 开销金额列表
    
    redis> LPUSH today_cost 30 1.5 10 8
    (integer) 4
    
    # 排序
    
    redis> SORT today_cost
    1) "1.5"
    2) "8"
    3) "10"
    4) "30"
    
    # 逆序排序
    
    redis 127.0.0.1:6379> SORT today_cost DESC
    1) "30"
    2) "10"
    3) "8"
    4) "1.5"
    

    6.`TYPE

    TYPE key

    返回 key 所储存的值的类型。

    返回值:
    none (key不存在)
    string (字符串)
    list (列表)
    set (集合)
    zset (有序集)
    hash (哈希表)

    # 字符串
    
    redis> SET weather "sunny"
    OK
    
    redis> TYPE weather
    string
    
    
    # 列表
    
    redis> LPUSH book_list "programming in scala"
    (integer) 1
    
    redis> TYPE book_list
    list
    
    
    # 集合
    
    redis> SADD pat "dog"
    (integer) 1
    
    redis> TYPE pat
    set
    

    String(字符串)

    1. APPEND

    APPEND key value

    如果 key 已经存在并且是一个字符串, APPEND 命令将value 追加到 key原来的值的末尾。
    如果key不存在, APPEND 就简单地将给定
    key设为value,,就像执行 SET key value 一样。

    # 对不存在的 key 执行 APPEND
    
    redis> EXISTS myphone               # 确保 myphone 不存在
    (integer) 0
    
    redis> APPEND myphone "nokia"       # 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia"
    (integer) 5                         # 字符长度
    
    
    # 对已存在的字符串进行 APPEND
    
    redis> APPEND myphone " - 1110"     # 长度从 5 个字符增加到 12 个字符
    (integer) 12
    
    redis> GET myphone
    "nokia - 1110"
    

    2. GET

    GET key

    返回 key 所关联的字符串值。
    如果 key 不存在那么返回特殊值 nil 。
    假如 key储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。

    # 对不存在的 key 或字符串类型 key 进行 GET
    
    redis> GET db
    (nil)
    
    redis> SET db redis
    OK
    
    redis> GET db
    "redis"
    
    
    # 对不是字符串类型的 key 进行 GET
    
    redis> DEL db
    (integer) 1
    
    redis> LPUSH db redis mongodb mysql
    (integer) 3
    
    redis> GET db
    (error) ERR Operation against a key holding the wrong kind of value
    

    GETRANGE
    返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
    负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。

    redis> SET greeting "hello, my friend"
    OK
    
    redis> GETRANGE greeting 0 4          # 返回索引0-4的字符,包括4。
    "hello"
    
    redis> GETRANGE greeting -1 -5        # 不支持回绕操作
    ""
    
    redis> GETRANGE greeting -3 -1        # 负数索引
    "end"
    
    redis> GETRANGE greeting 0 -1         # 从第一个到最后一个
    "hello, my friend"
    
    redis> GETRANGE greeting 0 1008611    # 值域范围不超过实际字符串,超过部分自动被符略
    "hello, my friend"
    

    GETSET

    GETSET key value

    将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

    当 key 存在但不是字符串类型时,返回一个错误。

    redis> GETSET db mongodb    # 没有旧值,返回 nil
    (nil)
    
    redis> GET db
    "mongodb"
    
    redis> GETSET db redis      # 返回旧值 mongodb
    "mongodb"
    
    redis> GET db
    "redis"
    

    MGET

    MGET key [key ...]

    返回所有(一个或多个)给定 key 的值。

    如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

    redis> SET redis redis.com
    OK
    
    
    redis> SET mongodb mongodb.org
    OK
    
    redis> MGET redis mongodb
    1) "redis.com"
    2) "mongodb.org"
    
    redis> MGET redis mongodb mysql     # 不存在的 mysql 返回 nil
    1) "redis.com"
    2) "mongodb.org"
    3) (nil)
    

    3.`SET
    SET key value [EX seconds] [PX milliseconds] [NX|XX]

    将字符串值value关联到 key。

    如果key 已经持有其他值, SET 就覆写旧值,无视类型。

    对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。

    可选参数

    从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:

    • EX second :设置键的过期时间为second 秒。SET key value EX second效果等同于 SETEX key second value。
    • PX millisecond :设置键的过期时间为 millisecond 毫秒。SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
    • NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
    • XX :只在键已经存在时,才对键进行设置操作。
    # 对不存在的键进行设置
    
    redis 127.0.0.1:6379> SET key "value"
    OK
    
    redis 127.0.0.1:6379> GET key
    "value"
    
    
    # 对已存在的键进行设置
    
    redis 127.0.0.1:6379> SET key "new-value"
    OK
    
    redis 127.0.0.1:6379> GET key
    "new-value"
    
    
    # 使用 EX 选项
    
    redis 127.0.0.1:6379> SET key-with-expire-time "hello" EX 10086
    OK
    
    redis 127.0.0.1:6379> GET key-with-expire-time
    "hello"
    
    redis 127.0.0.1:6379> TTL key-with-expire-time
    (integer) 10069
    
    
    # 使用 PX 选项
    
    redis 127.0.0.1:6379> SET key-with-pexpire-time "moto" PX 123321
    OK
    
    redis 127.0.0.1:6379> GET key-with-pexpire-time
    "moto"
    
    redis 127.0.0.1:6379> PTTL key-with-pexpire-time
    (integer) 111939
    
    
    # 使用 NX 选项
    
    redis 127.0.0.1:6379> SET not-exists-key "value" NX
    OK      # 键不存在,设置成功
    
    redis 127.0.0.1:6379> GET not-exists-key
    "value"
    
    redis 127.0.0.1:6379> SET not-exists-key "new-value" NX
    (nil)   # 键已经存在,设置失败
    
    redis 127.0.0.1:6379> GEt not-exists-key
    "value" # 维持原值不变
    
    
    # 使用 XX 选项
    
    redis 127.0.0.1:6379> EXISTS exists-key
    (integer) 0
    
    redis 127.0.0.1:6379> SET exists-key "value" XX
    (nil)   # 因为键不存在,设置失败
    
    redis 127.0.0.1:6379> SET exists-key "value"
    OK      # 先给键设置一个值
    
    redis 127.0.0.1:6379> SET exists-key "new-value" XX
    OK      # 设置新值成功
    
    redis 127.0.0.1:6379> GET exists-key
    "new-value"
    
    
    # NX 或 XX 可以和 EX 或者 PX 组合使用
    
    redis 127.0.0.1:6379> SET key-with-expire-and-NX "hello" EX 10086 NX
    OK
    
    redis 127.0.0.1:6379> GET key-with-expire-and-NX
    "hello"
    
    redis 127.0.0.1:6379> TTL key-with-expire-and-NX
    (integer) 10063
    
    redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "old value"
    OK
    
    redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "new value" PX 123321
    OK
    
    redis 127.0.0.1:6379> GET key-with-pexpire-and-XX
    "new value"
    
    redis 127.0.0.1:6379> PTTL key-with-pexpire-and-XX
    (integer) 112999
    
    
    # EX 和 PX 可以同时出现,但后面给出的选项会覆盖前面给出的选项
    
    redis 127.0.0.1:6379> SET key "value" EX 1000 PX 5000000
    OK
    
    redis 127.0.0.1:6379> TTL key
    (integer) 4993  # 这是 PX 参数设置的值
    
    redis 127.0.0.1:6379> SET another-key "value" PX 5000000 EX 1000
    OK
    
    redis 127.0.0.1:6379> TTL another-key
    (integer) 997   # 这是 EX 参数设置的值
    

    MSET

    MSET key value [key value ...]

    同时设置一个或多个 key-value 对。

    MSET
    redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
    OK
    
    redis> MGET date time weather
    1) "2012.3.30"
    2) "11:00 a.m."
    3) "sunny"
    
    
    # MSET 覆盖旧值例子
    
    redis> SET google "google.hk"
    OK
    
    redis> MSET google "google.com"
    OK
    
    redis> GET google
    "google.com"
    

    4. STRLEN
    STRLEN key

    返回 key 所储存的字符串值的长度。

    当 key 储存的不是字符串值时,返回一个错误。

    
    # 获取字符串的长度
    
    redis> SET mykey "Hello world"
    OK
    
    redis> STRLEN mykey
    (integer) 11
    
    
    # 不存在的 key 长度为 0
    
    redis> STRLEN nonexisting
    (integer) 0
    

    Hash(哈希表)

    1.HSET

    HSET key field value

    将哈希表 key 中的域 field 的值设为 value 。
    如果 key不存在,一个新的哈希表被创建并进行 HSET 操作。
    如果域 field 已经存在于哈希表中,旧值将被覆盖。

    redis> HSET website google "www.g.cn"       # 设置一个新域
    (integer) 1
    
    redis> HSET website google "www.google.com" # 覆盖一个旧域
    (integer) 0
    

    HMSET
    HMSET key field value [field value ...]

    同时将多个 field-value (域-值)对设置到哈希表 key 中。

    此命令会覆盖哈希表中已存在的域。
    如果key 不存在,一个空哈希表被创建并执行 HMSET 操作。

    redis> HMSET website google www.google.com yahoo www.yahoo.com
    OK
    
    redis> HGET website google
    "www.google.com"
    
    redis> HGET website yahoo
    "www.yahoo.com"
    

    HSETNX
    将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
    若域field 已经存在,该操作无效。

    如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

    redis> HSETNX nosql key-value-store redis
    (integer) 1
    
    redis> HSETNX nosql key-value-store redis       # 操作无效,域 key-value-store 已存在
    (integer) 0
    

    2.HGET
    HGET key field

    返回哈希表 key 中给定域 field 的值。

    
    # 域存在
    
    redis> HSET site redis redis.com
    (integer) 1
    
    redis> HGET site redis
    "redis.com"
    
    
    # 域不存在
    
    redis> HGET site mysql
    (nil)
    

    HGETALL
    HGETALL key

    返回哈希表 key 中,所有的域和值。

    在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍

    redis> HSET people jack "Jack Sparrow"
    (integer) 1
    
    redis> HSET people gump "Forrest Gump"
    (integer) 1
    
    redis> HGETALL people
    1) "jack"          # 域
    2) "Jack Sparrow"  # 值
    3) "gump"
    4) "Forrest Gump"
    

    3.HEXISTS
    HEXISTS key field

    查看哈希表 key 中,给定域 field 是否存在。

    redis> HEXISTS phone myphone
    (integer) 0
    
    redis> HSET phone myphone nokia-1110
    (integer) 1
    
    redis> HEXISTS phone myphone
    

    4.HDEL
    HDEL key field [field ...]

    删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

    # 测试数据
    
    redis> HGETALL abbr
    1) "a"
    2) "apple"
    3) "b"
    4) "banana"
    5) "c"
    6) "cat"
    7) "d"
    8) "dog"
    
    
    # 删除单个域
    
    redis> HDEL abbr a
    (integer) 1
    
    
    # 删除不存在的域
    
    redis> HDEL abbr not-exists-field
    (integer) 0
    
    
    # 删除多个域
    
    redis> HDEL abbr b c
    (integer) 2
    
    redis> HGETALL abbr
    1) "d"
    2) "dog"
    

    5.HVALS

    HVALS key

    返回哈希表 key 中所有域的值。

    # 非空哈希表
    
    redis> HMSET website google www.google.com yahoo www.yahoo.com
    OK
    
    redis> HVALS website
    1) "www.google.com"
    2) "www.yahoo.com"
    
    
    # 空哈希表/不存在的key
    
    redis> EXISTS not_exists
    (integer) 0
    
    redis> HVALS not_exists
    (empty list or set)
    

    List(列表)

    1.LPUSH
    LPUSH key value [value ...]
    将一个或多个值 value 插入到列表 key 的表头
    如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。

    如果key不存在,一个空列表会被创建并执行 LPUSH 操作。

    当 key存在但不是列表类型时,返回一个错误。

    # 加入单个元素
    
    redis> LPUSH languages python
    (integer) 1
    
    
    # 加入重复元素
    
    redis> LPUSH languages python
    (integer) 2
    
    redis> LRANGE languages 0 -1     # 列表允许重复元素
    1) "python"
    2) "python"
    
    
    # 加入多个元素
    
    redis> LPUSH mylist a b c
    (integer) 3
    
    redis> LRANGE mylist 0 -1
    1) "c"
    2) "b"
    3) "a"
    

    LPUSHX
    LPUSHX key value
    将值 value插入到列表 key的表头,当且仅当 key存在并且是一个列表。

    LPUSH 命令相反,当 key不存在时, LPUSHX 命令什么也不做。

    # 对空列表执行 LPUSHX
    
    redis> LLEN greet                       # greet 是一个空列表
    (integer) 0
    
    redis> LPUSHX greet "hello"             # 尝试 LPUSHX,失败,因为列表为空
    (integer) 0
    
    
    # 对非空列表执行 LPUSHX
    
    redis> LPUSH greet "hello"              # 先用 LPUSH 创建一个有一个元素的列表
    (integer) 1
    
    redis> LPUSHX greet "good morning"      # 这次 LPUSHX 执行成功
    (integer) 2
    
    redis> LRANGE greet 0 -1
    1) "good morning"
    2) "hello"
    

    RPUSH
    RPUSH key value [value ...]
    将一个或多个值 value 插入到列表 key 的表尾(最右边)。
    如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
    如果 key不存在,一个空列表会被创建并执行 RPUSH 操作。
    当 key 存在但不是列表类型时,返回一个错误。

    # 添加单个元素
    
    redis> RPUSH languages c
    (integer) 1
    
    
    # 添加重复元素
    
    redis> RPUSH languages c
    (integer) 2
    
    redis> LRANGE languages 0 -1 # 列表允许重复元素
    1) "c"
    2) "c"
    
    
    # 添加多个元素
    
    redis> RPUSH mylist a b c
    (integer) 3
    
    redis> LRANGE mylist 0 -1
    1) "a"
    2) "b"
    3) "c"
    

    RPUSHX
    RPUSHX key value
    将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。
    RPUSH 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。

    # key不存在
    
    redis> LLEN greet
    (integer) 0
    
    redis> RPUSHX greet "hello"     # 对不存在的 key 进行 RPUSHX,PUSH 失败。
    (integer) 0
    
    
    # key 存在且是一个非空列表
    
    redis> RPUSH greet "hi"         # 先用 RPUSH 插入一个元素
    (integer) 1
    
    redis> RPUSHX greet "hello"     # greet 现在是一个列表类型,RPUSHX 操作成功。
    (integer) 2
    
    redis> LRANGE greet 0 -1
    1) "hi"
    2) "hello"
    

    2.LPOP
    LPOP key
    移除并返回列表 key 的头元素。

    redis> LLEN course
    (integer) 0
    
    redis> RPUSH course algorithm001
    (integer) 1
    
    redis> RPUSH course c++101
    (integer) 2
    
    redis> LPOP course  # 移除头元素
    "algorithm001"
    

    RPOP
    RPOP key
    移除并返回列表 key 的尾元素。

    redis> RPUSH mylist "one"
    (integer) 1
    
    redis> RPUSH mylist "two"
    (integer) 2
    
    redis> RPUSH mylist "three"
    (integer) 3
    
    redis> RPOP mylist           # 返回被弹出的元素
    "three"
    
    redis> LRANGE mylist 0 -1    # 列表剩下的元素
    1) "one"
    2) "two"
    

    3.LSET

    LSET key index value
    将列表 key 下标为 index 的元素的值设置为 value 。
    当 index 参数超出范围,或对一个空列表(key不存在)进行 LSET 时,返回一个错误。
    关于列表下标的更多信息,请参考 LINDEX 命令。

    # 对空列表(key 不存在)进行 LSET
    
    redis> EXISTS list
    (integer) 0
    
    redis> LSET list 0 item
    (error) ERR no such key
    
    
    # 对非空列表进行 LSET
    
    redis> LPUSH job "cook food"
    (integer) 1
    
    redis> LRANGE job 0 0
    1) "cook food"
    
    redis> LSET job 0 "play game"
    OK
    
    redis> LRANGE job  0 0
    1) "play game"
    
    
    # index 超出范围
    
    redis> LLEN list                    # 列表长度为 1
    (integer) 1
    
    redis> LSET list 3 'out of range'
    (error) ERR index out of range
    

    4.LINDEX
    LINDEX key index
    返回列表 key 中,下标为 index 的元素。
    下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
    你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    如果 key 不是列表类型,返回一个错误。

    redis> LPUSH mylist "World"
    (integer) 1
    
    redis> LPUSH mylist "Hello"
    (integer) 2
    
    redis> LINDEX mylist 0
    "Hello"
    
    redis> LINDEX mylist -1
    "World"
    
    redis> LINDEX mylist 3        # index不在 mylist 的区间范围内
    (nil)
    
    

    5.LINSERT
    LINSERT key BEFORE|AFTER pivot value
    将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
    当 pivot 不存在于列表 key 时,不执行任何操作。
    当 key 不存在时, key 被视为空列表,不执行任何操作。
    如果 key 不是列表类型,返回一个错误。

    redis> RPUSH mylist "Hello"
    (integer) 1
    
    redis> RPUSH mylist "World"
    (integer) 2
    
    redis> LINSERT mylist BEFORE "World" "There"
    (integer) 3
    
    redis> LRANGE mylist 0 -1
    1) "Hello"
    2) "There"
    3) "World"
    
    
    # 对一个非空列表插入,查找一个不存在的 pivot
    
    redis> LINSERT mylist BEFORE "go" "let's"
    (integer) -1                                    # 失败
    
    
    # 对一个空列表执行 LINSERT 命令
    
    redis> EXISTS fake_list
    (integer) 0
    
    redis> LINSERT fake_list BEFORE "nono" "gogogog"
    (integer) 0                                      # 失败
    

    6.LLEN
    LLEN key
    返回列表 key 的长度。
    如果 key 不存在,则 key 被解释为一个空列表,返回 0 .
    如果 key 不是列表类型,返回一个错误。

    # 空列表
    
    redis> LLEN job
    (integer) 0
    
    
    # 非空列表
    
    redis> LPUSH job "cook food"
    (integer) 1
    
    redis> LPUSH job "have lunch"
    (integer) 2
    
    redis> LLEN job
    (integer) 2
    

    7.LRANGE
    LRANGE key start stop
    返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
    下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
    你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    超出范围的下标
    超出范围的下标值不会引起错误。
    如果start下标比列表的最大下标 end ( LLEN减去 1)还要大,那么 LRANGE 返回一个空列表。
    如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。

    redis> RPUSH fp-language lisp
    (integer) 1
    
    redis> LRANGE fp-language 0 0
    1) "lisp"
    
    redis> RPUSH fp-language scheme
    (integer) 2
    
    redis> LRANGE fp-language 0 1
    1) "lisp"
    2) "scheme"
    
    

    8.LTRIM
    LTRIM key start stop
    对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
    举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
    下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
    你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    当 <tt class="docutils literal" style="background-color: transparent; font-size: 1.1em; font-family: monospace;">key</tt> 不是列表类型时,返回一个错误。

    LTRIM 命令通常和 LPUSH 命令或 RPUSH 命令配合使用,举个例子:

    LPUSH log newest_log
    LTRIM log 0 99
    
    

    这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。

    超出范围的下标
    超出范围的下标值不会引起错误。
    如果 start下标比列表的最大下标 end ( LLEN减去 1 )还要大,或者 start>stop, LTRIM 返回一个空列表(因为 LTRIM 已经将整个列表清空)。
    如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。

    # 情况 1: 常见情况, start 和 stop 都在列表的索引范围之内
    
    redis> LRANGE alpha 0 -1       # alpha 是一个包含 5 个字符串的列表
    1) "h"
    2) "e"
    3) "l"
    4) "l"
    5) "o"
    
    redis> LTRIM alpha 1 -1        # 删除 alpha 列表索引为 0 的元素
    OK
    
    redis> LRANGE alpha 0 -1       # "h" 被删除了
    1) "e"
    2) "l"
    3) "l"
    4) "o"
    
    
    # 情况 2: stop 比列表的最大下标还要大
    
    
    redis> LTRIM alpha 1 10086     # 保留 alpha 列表索引 1 至索引 10086 上的元素
    OK
    
    redis> LRANGE alpha 0 -1       # 只有索引 0 上的元素 "e" 被删除了,其他元素还在
    1) "l"
    2) "l"
    3) "o"
    
    
    # 情况 3: start 和 stop 都比列表的最大下标要大,并且 start < stop
    
    redis> LTRIM alpha 10086 123321
    OK
    
    redis> LRANGE alpha 0 -1        # 列表被清空
    (empty list or set)
    
    
    # 情况 4: start 和 stop 都比列表的最大下标要大,并且 start > stop
    
    redis> RPUSH new-alpha "h" "e" "l" "l" "o"     # 重新建立一个新列表
    (integer) 5
    
    redis> LRANGE new-alpha 0 -1
    1) "h"
    2) "e"
    3) "l"
    4) "l"
    5) "o"
    
    redis> LTRIM new-alpha 123321 10086    # 执行 LTRIM
    OK
    
    redis> LRANGE new-alpha 0 -1           # 同样被清空
    (empty list or set)
    

    Set(集合)

    1.SADD
    SADD key member [member ...]

    将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

    假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

    当 key 不是集合类型时,返回一个错误。

    # 添加单个元素
    
    redis> SADD bbs "discuz.net"
    (integer) 1
    
    
    # 添加重复元素
    
    
    redis> SADD bbs "discuz.net"
    (integer) 0
    
    
    # 添加多个元素
    
    redis> SADD bbs "tianya.cn" "groups.google.com"
    (integer) 2
    
    redis> SMEMBERS bbs
    1) "discuz.net"
    2) "groups.google.com"
    3) "tianya.cn"
    
    

    2.SCARD
    SCARD key

    返回集合 key 的基数(集合中元素的数量)。

    redis> SADD tool pc printer phone
    (integer) 3
    
    redis> SCARD tool   # 非空集合
    (integer) 3
    
    redis> DEL tool
    (integer) 1
    
    redis> SCARD tool   # 空集合
    (integer) 0
    

    3.SDIFF
    SDIFF key [key ...]

    返回一个集合的全部成员,该集合是所有给定集合之间的差集。

    不存在的 key 被视为空集。

    redis> SMEMBERS peter's_movies
    1) "bet man"
    2) "start war"
    3) "2012"
    
    redis> SMEMBERS joe's_movies
    1) "hi, lady"
    2) "Fast Five"
    3) "2012"
    
    redis> SDIFF peter's_movies joe's_movies
    1) "bet man"
    2) "start war"
    

    SDIFFSTORE
    这个命令的作用和 SDIFF 类似,但它将结果保存到destination集合,而不是简单地返回结果集。

    如果 destination集合已经存在,则将其覆盖。

    destination可以是key本身。

    
    redis> SMEMBERS joe's_movies
    1) "hi, lady"
    2) "Fast Five"
    3) "2012"
    
    redis> SMEMBERS peter's_movies
    1) "bet man"
    2) "start war"
    3) "2012"
    
    redis> SDIFFSTORE joe_diff_peter joe's_movies peter's_movies
    (integer) 2
    
    redis> SMEMBERS joe_diff_peter
    1) "hi, lady"
    2) "Fast Five"
    

    4.SINTER

    SINTER key [key ...]

    返回一个集合的全部成员,该集合是所有给定集合的交集。

    不存在的 key 被视为空集。

    当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

    redis> SMEMBERS group_1
    1) "LI LEI"
    2) "TOM"
    3) "JACK"
    
    redis> SMEMBERS group_2
    1) "HAN MEIMEI"
    2) "JACK"
    
    redis> SINTER group_1 group_2
    1) "JACK"
    

    SINTERSTORE

    SINTERSTORE destination key [key ...]

    这个命令类似于 SINTER 命令,但它将结果保存到destination 集合,而不是简单地返回结果集。

    如果destination 集合已经存在,则将其覆盖。

    destination可以是key本身。

    redis> SMEMBERS songs
    1) "good bye joe"
    2) "hello,peter"
    
    redis> SMEMBERS my_songs
    1) "good bye joe"
    2) "falling"
    
    redis> SINTERSTORE song_interset songs my_songs
    (integer) 1
    
    redis> SMEMBERS song_interset
    1) "good bye joe"
    

    5.SISMEMBER

    SISMEMBER key member

    判断 member 元素是否集合 key 的成员。

    redis> SMEMBERS joe's_movies
    1) "hi, lady"
    2) "Fast Five"
    3) "2012"
    
    redis> SISMEMBER joe's_movies "bet man"
    (integer) 0
    
    redis> SISMEMBER joe's_movies "Fast Five"
    (integer) 1
    

    SMEMBERS
    SMEMBERS key

    返回集合 key 中的所有成员。

    不存在的 key 被视为空集合。

    # key 不存在或集合为空
    
    redis> EXISTS not_exists_key
    (integer) 0
    
    redis> SMEMBERS not_exists_key
    (empty list or set)
    
    
    # 非空集合
    
    redis> SADD language Ruby Python Clojure
    (integer) 3
    
    redis> SMEMBERS language
    1) "Python"
    2) "Ruby"
    3) "Clojure"
    
    

    6.SMOVE

    SortedSet(有序集合)

    SMOVE source destination member
    将 member 元素从 source 集合移动到 destination 集合。
    SMOVE 是原子性操作。
    如果 source集合不存在或不包含指定的 member元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source集合中被移除,并添加到 destination集合中去。
    当destination 集合已经包含member 元素时, SMOVE 命令只是简单地将
    source集合中的member元素删除。
    当 source 或 destination 不是集合类型时,返回一个错误。

    redis> SMEMBERS songs
    1) "Billie Jean"
    2) "Believe Me"
    
    redis> SMEMBERS my_songs
    (empty list or set)
    
    redis> SMOVE songs my_songs "Believe Me"
    (integer) 1
    
    redis> SMEMBERS songs
    1) "Billie Jean"
    
    redis> SMEMBERS my_songs
    1) "Believe Me"
    

    7.SPOP
    SPOP key

    移除并返回集合中的一个随机元素。

    如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。

    redis> SMEMBERS db
    1) "MySQL"
    2) "MongoDB"
    3) "Redis"
    
    redis> SPOP db
    "Redis"
    
    redis> SMEMBERS db
    1) "MySQL"
    2) "MongoDB"
    
    redis> SPOP db
    "MySQL"
    
    redis> SMEMBERS db
    1) "MongoDB"
    

    8.SUNION
    SUNION key [key ...]

    返回一个集合的全部成员,该集合是所有给定集合的并集。

    不存在的 key 被视为空集。

    
    redis> SMEMBERS songs
    1) "Billie Jean"
    
    redis> SMEMBERS my_songs
    1) "Believe Me"
    
    redis> SUNION songs my_songs
    1) "Billie Jean"
    2) "Believe Me"
    

    SUNIONSTORE
    SUNIONSTORE destination key [key ...]

    这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
    如果 destination已经存在,则将其覆盖。
    destination 可以是 key 本身。

    redis> SMEMBERS NoSQL
    1) "MongoDB"
    2) "Redis"
    
    redis> SMEMBERS SQL
    1) "sqlite"
    2) "MySQL"
    
    redis> SUNIONSTORE db NoSQL SQL
    (integer) 4
    
    redis> SMEMBERS db
    1) "MySQL"
    2) "sqlite"
    3) "MongoDB"
    4) "Redis"
    

    1.ZADD
    ZADD key score member [[score member] [score member] ...]

    将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

    如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

    <tt class="docutils literal" style="background-color: transparent; font-size: 1.1em; font-family: monospace;">score</tt> 值可以是整数值或双精度浮点数。

    如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。

    当 key 存在但不是有序集类型时,返回一个错误。

    # 添加单个元素
    
    redis> ZADD page_rank 10 google.com
    (integer) 1
    
    
    # 添加多个元素
    
    redis> ZADD page_rank 9 baidu.com 8 bing.com
    (integer) 2
    
    redis> ZRANGE page_rank 0 -1 WITHSCORES
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"
    
    
    # 添加已存在元素,且 score 值不变
    
    redis> ZADD page_rank 10 google.com
    (integer) 0
    
    redis> ZRANGE page_rank 0 -1 WITHSCORES  # 没有改变
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"
    
    
    # 添加已存在元素,但是改变 score 值
    
    redis> ZADD page_rank 6 bing.com
    (integer) 0
    
    redis> ZRANGE page_rank 0 -1 WITHSCORES  # bing.com 元素的 score 值被改变
    1) "bing.com"
    2) "6"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"
    
    

    2.ZCARD
    ZCARD key
    返回有序集 key 的基数。

    redis > ZADD salary 2000 tom    # 添加一个成员
    (integer) 1
    
    redis > ZCARD salary
    (integer) 1
    
    redis > ZADD salary 5000 jack   # 再添加一个成员
    (integer) 1
    
    redis > ZCARD salary
    (integer) 2
    
    redis > EXISTS non_exists_key   # 对不存在的 key 进行 ZCARD 操作
    (integer) 0
    
    redis > ZCARD non_exists_key
    (integer) 0
    

    3.ZCOUNT

    ZCOUNT key min max
    返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
    关于参数 min和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。

    redis> ZRANGE salary 0 -1 WITHSCORES    # 测试数据
    1) "jack"
    2) "2000"
    3) "peter"
    4) "3500"
    5) "tom"
    6) "5000"
    
    redis> ZCOUNT salary 2000 5000          # 计算薪水在 2000-5000 之间的人数
    (integer) 3
    
    redis> ZCOUNT salary 3000 5000          # 计算薪水在 3000-5000 之间的人数
    (integer) 2
    

    4.ZRANGE
    ZRANGE key start stop [WITHSCORES]

    返回有序集 key 中,指定区间内的成员。

    其中成员的位置按score 值递增(从小到大)来排序。

    具有相同 score 值的成员按字典序(lexicographical order )来排列。

    如果你需要成员按score值递减(从大到小)来排列,请使用 ZREVRANGE 命令。

    下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
    你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

    超出范围的下标并不会引起错误。
    比如说,当 start的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
    另一方面,假如stop参数的值比有序集的最大下标还要大,那么 Redis 将stop 当作最大下标来处理。

    可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
    客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。

    redis > ZRANGE salary 0 -1 WITHSCORES             # 显示整个有序集成员
    1) "jack"
    2) "3500"
    3) "tom"
    4) "5000"
    5) "boss"
    6) "10086"
    
    redis > ZRANGE salary 1 2 WITHSCORES              # 显示有序集下标区间 1 至 2 的成员
    1) "tom"
    2) "5000"
    3) "boss"
    4) "10086"
    
    redis > ZRANGE salary 0 200000 WITHSCORES         # 测试 end 下标超出最大下标时的情况
    1) "jack"
    2) "3500"
    3) "tom"
    4) "5000"
    5) "boss"
    6) "10086"
    
    redis > ZRANGE salary 200000 3000000 WITHSCORES   # 测试当给定区间不存在于有序集时的情况
    (empty list or set)
    

    5.ZREM
    ZREM key member [member ...]
    移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

    当 key 存在但不是有序集类型时,返回一个错误。

    # 测试数据
    
    redis> ZRANGE page_rank 0 -1 WITHSCORES
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "9"
    5) "google.com"
    6) "10"
    
    
    # 移除单个元素
    
    redis> ZREM page_rank google.com
    (integer) 1
    
    redis> ZRANGE page_rank 0 -1 WITHSCORES
    1) "bing.com"
    2) "8"
    3) "baidu.com"
    4) "9"
    
    
    # 移除多个元素
    
    redis> ZREM page_rank baidu.com bing.com
    (integer) 2
    
    redis> ZRANGE page_rank 0 -1 WITHSCORES
    (empty list or set)
    
    
    # 移除不存在元素
    
    redis> ZREM page_rank non-exists-element
    (integer) 0
    

    6.ZUNIONSTORE
    ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

    计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。

    默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
    WEIGHTS
    使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。

    如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
    AGGREGATE
    使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。

    默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。

    redis> ZRANGE programmer 0 -1 WITHSCORES
    1) "peter"
    2) "2000"
    3) "jack"
    4) "3500"
    5) "tom"
    6) "5000"
    
    redis> ZRANGE manager 0 -1 WITHSCORES
    1) "herry"
    2) "2000"
    3) "mary"
    4) "3500"
    5) "bob"
    6) "4000"
    
    redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3   # 公司决定加薪。。。除了程序员。。。
    (integer) 6
    
    redis> ZRANGE salary 0 -1 WITHSCORES
    1) "peter"
    2) "2000"
    3) "jack"
    4) "3500"
    5) "tom"
    6) "5000"
    7) "herry"
    8) "6000"
    9) "mary"
    10) "10500"
    11) "bob"
    12) "12000"
    
    

    7.ZINTERSTORE

    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
    计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
    默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
    关于 WEIGHTS和 AGGREGATE选项的描述,参见 ZUNIONSTORE 命令。

    redis > ZADD mid_test 70 "Li Lei"
    (integer) 1
    redis > ZADD mid_test 70 "Han Meimei"
    (integer) 1
    redis > ZADD mid_test 99.5 "Tom"
    (integer) 1
    
    redis > ZADD fin_test 88 "Li Lei"
    (integer) 1
    redis > ZADD fin_test 75 "Han Meimei"
    (integer) 1
    redis > ZADD fin_test 99.5 "Tom"
    (integer) 1
    
    redis > ZINTERSTORE sum_point 2 mid_test fin_test
    (integer) 3
    
    redis > ZRANGE sum_point 0 -1 WITHSCORES     # 显示有序集内所有成员及其 score 值
    1) "Han Meimei"
    2) "145"
    3) "Li Lei"
    4) "158"
    5) "Tom"
    6) "199"
    
    

    相关文章

      网友评论

          本文标题:Redis常用命令

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