Redis附加功能-键操作

126 阅读9分钟
单个键
  • TYPE key 返回键key存储的值的类型

    返回值值类型
    none键不存在
    string字符串或者HyperLogLog(HLL是二进制字值)
    hash散列
    list列表
    set集合
    zset有序集合
    127.0.0.1:6379> type hash
    hash
    127.0.0.1:6379> type list
    list
    127.0.0.1:6379> type price
    zset
    127.0.0.1:6379> type num1
    set
    127.0.0.1:6379> type msg
    string
    127.0.0.1:6379> type hello
    none
    
  • DEL key [key ...] 删除给定的任意多个键,不存在的键会被忽略,命令返回被成功删除的键数量

    127.0.0.1:6379> del num3 num4
    2
    
  • EXISTS key 检查给定的键是否存在,存在返回:1,不存在返回:0

    127.0.0.1:6379> exists msg
    1
    127.0.0.1:6379> exists msg1
    0
    
  • RENAME key newkey 将键的名字从key改为newkey,如果newkey已经存在,那么覆盖。键key不存在,或者key和newkey同名时,返回错误,修改成功返回OK

    127.0.0.1:6379> rename msg msgnew
    OK
    
  • RENAMENX key newkey 如果键newkey不存在,那么将键key改为newkey 如果键newkey已经存在,那么不做操作 修改成功返回1,修改失败返回0

    127.0.0.1:6379> renamenx msg msgnew
    (integer) 0
    127.0.0.1:6379> renamenx msg msgnew1
    (integer) 1
    
键过期功能
  • EXPIRE key seconds 将键 key 的生存时间设置为指定的秒数

    127.0.0.1:6379> expire msg 5
    (integer) 1
    127.0.0.1:6379> expire msg1 5
    (integer) 0
    127.0.0.1:6379> exists msg    #时间到键已被删除不会
    (integer) 0
    
  • PEXPIRE key milliseconds 将键 key 的生存时间设置为指定的毫秒数

    127.0.0.1:6379> pexpire msg 1000
    (integer) 1
    

    如果给定的键不存在,那么 EXPIRE 和 PEXPIRE 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功 当一个键被设置了生存时间之后,它的生存时间将会随着时间的流逝而减少:时间过去一毫秒,键的生存时间就减少一毫秒;时间过去一秒钟,键的生存时间就减少一秒钟;以此类推。当一个键的生存时间被减少至低于 0 时,Redis就会自动将这个键删除掉

  • EXPIREAT key timestamp 将键 key 的过期时间设置为指定的秒级UNIX 时间戳

  • PEXPIREAT key milliseconds-timestamp 将键 key 的过期时间设置为指定的毫秒级UNIX 时间戳

    如果给定的键不存在,那么 EXPIREAT 和 PEXPIREAT 将返回 0 ,表示设置失败;如果命令返回 1 ,那么表示设置成功。 对于被设置了过期时间的键来说,当键的过期时间小于当前时间的时候,Redis就会自动地删除该键

  • 生存时间和过期时间的区别

    设置生存时间和设置过期时间都可以让 Redis 自动删除指定的键,它们的区别在于设置“键什么时候被删除”的方式不同:  • EXPIRE 和 PEXIRE 的作用是让键在 N 秒钟或者 N 毫秒之后被删除  • 而 EXPIREAT 和 PEXPIREAT 的作用则是让键在指定的 UNIX 时间到达之后被删除。 带有生存时间的键就像是一个倒计时器,它会倒数 5、4、3、2、1、0,然后被删掉 而带有过期时间的键则像是一个定时器,它会在指定的时间来临之后被删掉

  • TTL key 以秒为单位,返回键的剩余生存时间

    127.0.0.1:6379> ttl msg
    (integer) 58
    127.0.0.1:6379> ttl msg
    (integer) -2
    
  • PTTL key 以毫秒为单位,返回键的剩余生存时间

    127.0.0.1:6379> pttl msg
    (integer) 53144
    

    Redis没有提供查看键的过期时间的命令,只能通过TTL和PTTL来查看键的过期剩余时间

TTL 和 PTTL可能会返回三种不同的值

返回 值意 义
-2键不存在
-1键存在,但没有设置过期时间或者生存时间
>= 0键的剩余生存时间
  • PERSIST key 移除为键 key设置的过期时间或生存时间,使得它不会被自动删除。 移除成功时命令返回1,如果命令没有设置过期时间或生存时间,那么命令返回 0
    127.0.0.1:6379> expire msg 60
    (integer) 1
    127.0.0.1:6379>  persist msg
    (integer) 1
    127.0.0.1:6379> ttl msg
    (integer) -1
    
对键的值进行排序

通过调用SORT命令,可以对列表、集合以及有序集合进行排序,对于原本已经有序的列表和有序集合,SORT命令可以让其他方式来排序值

SORT key [BY parrern] [LIMIT offset count] [GET pattern [GET pattern ....]] [ASC | DESC] [ALPHA] [STORE destination]

  • 最简单情形:SORT key 将输入键包含的值解释为浮点数,然后对这些浮点数按照值本身大小进行排序

    127.0.0.1:6379> rpush num 1 3 5 2 8 4 0 6 7
    (integer) 9
    127.0.0.1:6379> sort num 
    1) "0"
    2) "1"
    3) "2"
    4) "3"
    5) "4"
    6) "5"
    7) "6"
    8) "7"
    9) "8"
    
  • 升序排序和降序排序 ASC: 排序后的值会从小到大的顺序排列(升序排列) DESC: 排序后的值会从大到小的顺序排列(降序排列)

    127.0.0.1:6379> sort num asc
    1) "0"
    2) "1"
    3) "2"
    4) "3"
    5) "4"
    6) "5"
    7) "6"
    8) "7"
    9) "8"
    127.0.0.1:6379> sort num desc
    1) "8"
    2) "7"
    3) "6"
    4) "5"
    5) "4"
    6) "3"
    7) "2"
    8) "1"
    9) "0"
    
  • 对文字进行排序 默认情况下,SORT命令会将键包含的值解释为浮点数,然后对浮点数进行排序,但通过给定ALPHA参数,可以让SORT命令基于字典序对文件进行排序 一般情况下,有序集合里面的元素会根据分值来进行排序,但是通过执行SORT带有ALPHA参数后,可以根据元素本身来进行排序

    127.0.0.1:6379> sadd name tom peter jack tony
    (integer) 4
    127.0.0.1:6379> sort name
    (error) ERR One or more scores can't be converted into double
    127.0.0.1:6379> sort name alpha
    1) "jack"
    2) "peter"
    3) "tom"
    4) "tony"
    
  • 基于外部键的值进行排序 默认情况,SORT命令在进行排序的时候,会使用被排序键本身包含的值来作为权重,但是通过执行BY pattern 选项,可以让SORT命令使用其他键的值来作为权重,对被排序键的值进行排序

    127.0.0.1:6379> sadd name java php c++
    (integer) 3
    127.0.0.1:6379> sort name alpha
    1) "c++"
    2) "java"
    3) "php"
    127.0.0.1:6379> mset java-score 100 php-score 50 c++-score 20
    OK
    127.0.0.1:6379> sort name by *-score
    1) "c++"
    2) "php"
    3) "java"
    
  • 获取外部键的值作为返回值 默认情况下,SORT命令会返回被排序键的值作为返回值,但是通过给定GET pattern选项,可以让SORT命令返回其他键的值来作为命令的返回值

    127.0.0.1:6379>  sadd name java php c++
    (integer) 3
    127.0.0.1:6379> sort name alpha
    1) "c++"
    2) "java"
    3) "php"
    127.0.0.1:6379> mset java-name "JAVA" php-name "PHP" c++-name "C OR C++" 
    OK
    127.0.0.1:6379> sort name alpha get *-name
    1) "C OR C++"
    2) "JAVA"
    3) "PHP"
    
  • 指定返回结果的数量 默认情况下,SORT命令返回被排序键的所有值作为结果,但是通过指定 LIMIT offset count选项,可以让命令返回结果之前晓跳过offset 个值,然后只返回count个值

    127.0.0.1:6379> lpush num 9 8 4 0 1 3 2 7 5 6
    (integer) 10
    127.0.0.1:6379> sort num
    1) "0"
    2) "1"
    3) "2"
    4) "3"
    5) "4"
    6) "5"
    7) "6"
    8) "7"
    9) "8"
    10) "9"
    127.0.0.1:6379> sort num limit 0 3
    1) "0"
    2) "1"
    3) "2"
    127.0.0.1:6379> sort num limit 2 3
    1) "2"
    2) "3"
    3) "4"
    
  • 存储排序结果 默认情况下,SORT命令只会向客户端返回排序结果,单并不存储排序结果,通过指定选项STORE destkey,可以将结果存储到destkey中

    127.0.0.1:6379> sort num store num-store
    (integer) 10
    127.0.0.1:6379> lrange num-store 0 -1
    1) "0"
    2) "1"
    3) "2"
    4) "3"
    5) "4"
    6) "5"
    7) "6"
    8) "7"
    9) "8"
    10) "9"
    
  • 使用多个选项和参数 SORT命令可以用户同时使用上面提到的所有选项和参数,通过适当地组合使用不同的参数和选项,可以将SORT命令变成一个强大的排序工具及数据获取工具

获取数据库中的键
  • RANDOMKEY 从当前数据库中随机返回一个键,被返回的键不会被删除 如果数据库不包含任何键值对(为空),则命令返回nil

    127.0.0.1:6379> randomkey
    "java-name"
    127.0.0.1:6379> randomkey
    "name"
    127.0.0.1:6379> randomkey
    "list"
    
  • keys pattern 返回当前数据库中,所有匹配给定模式pattern的键

    模式匹配的键
    KEYS *数据库中的所有键
    KEYS h?llohello,hallo,hbllo等
    KEYS h*llohello,hllo,heeello,haaaalo等键
    KEYS h[ae]llohello、hallo
    127.0.0.1:6379> keys *
    1) "java-score"
    2) "php-score"
    3) "java-name"
    4) "msgnew1"
    5) "php-name"
    6) "hash"
    7) "num"
    127.0.0.1:6379> keys c*
    1) "c++-score"
    2) "c++-name"
    127.0.0.1:6379> keys  n*um*
    1) "num"
    2) "num2"
    3) "num-store"
    4) "num5"
    5) "num1"
    
    因为KEYS命令会一次性遍历整个数据库来获取所有与给定模式想匹配的键,所有随着包含的键值对越来越多,这个命令的执行速度会越来越慢,可能会导致数据库服务器被阻塞一段时间
    Redis从2.8.0版本开始提供SCAN命令,可以以渐进的方式,分多次遍历整个数据库,返回匹配给定模式的键
  • SCAN cursor [MATCH pattern] [COUNT number] cursor: 遍历时使用的游标,在开始一次新的遍历时,需要将cursor设置为0,之后每次调用SCAN,命令都会返回一个新的游标值,再次调用SCAN命令时需要输入这个游标值来继续上次的遍历,当命令返回的游标值为0时,遍历结束 MATCH pattern: 用于指定匹配的模式,类似于KEY命令的pattern参数 COUNT number: 指定这次遍历最多要返回多少个键,命令实际返回的键数量可能比这个值少,有时候,命令甚至会一个键也不返回,但只要命令返回的游标值不为0,就说明遍历没有结束,number参数默认值为:10

    SCAN 命令使用的算法可以保证,遍历从开始到结束期间,一直存在于数据库里面的键肯定会被遍历到,但中途被删除或者中途添加的键是否被遍历规则是不确定的,可能会可能不会 另外,命令可能会返回同一个键多次,要求无重复结果需要自己在客户端里面进行过滤

  • 对比KEYS和SCAN

    \KEYSSCAN
    处理方式一次性遍历整个数据库并返回所有结果每次遍历数据库中的一部分键,并返回一部分结果
    是否阻塞可能会不会
    是否出现重复值不会可能会
    复杂度O(N),N为包含的键值对数量每次执行的复杂度为O(1)
    遍历整个数据库的总复杂度为O(N),N为数据库包含的键值对数量