• Redis key操作实战(全)


    目录

    DEL 删除KEY

    EXPIRE 设置过期时间

    PERSIST 移除给定KEY的生存时间

    EXPIREAT 设置过期时间-时间戳

    TTL 获取剩余过期时间

    PTTL 获取剩余过期时间

    RENAME 重命名KEY

    RENAMENX 重命名KEY

    EXISTS 判断KEY是否存在

    KEYS 按模式匹配KEY

    SORT 排序

    SORT key asc|desc 数字排序

    SORT key alpha 字符串排序

    sort key limit start size 限制返回数量

    DUMP 序列化给定 KEY

    RESTORE 反序列化给定 KEY

    OBJECT 查看KEY内部存储信息

    TYPE 查值的类型


    DEL 删除KEY

    DEL key [key ...]:删除给定的一个或多个 key

    • 若key不存在,则忽略
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi # 初始化key
    4. OK
    5. 127.0.0.1:6379> set age 22
    6. OK
    7. (integer) 1
    8. 127.0.0.1:6379> lpush mylist apple banana orange pear
    9. (integer) 4
    10. 127.0.0.1:6379> del name age mylist address # 删除key
    11. (integer) 3 # 删除成功的key数量(不存在的key忽略)

    时间复杂度:

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

    返回:

    • 被删除 key 的数量

    EXPIRE 设置过期时间

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

    • 如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变
    • 对一个 key 执行 INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命令,这类操作都不会修改 key 本身的生存时间
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set age 20
    4. OK
    5. 127.0.0.1:6379> expire age 20
    6. (integer) 1
    7. 127.0.0.1:6379> get age # 查看age值
    8. "21"
    9. 127.0.0.1:6379> get age # 过20秒再查看
    10. (nil)
    • 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> expire name 20 # 设置过期时间为20
    6. (integer) 1
    7. 127.0.0.1:6379> rename name name2 # 重命名key为name2
    8. OK
    9. 127.0.0.1:6379> keys * # 查看库中有多少key
    10. 1) "name2"
    11. 127.0.0.1:6379> get name2 # 查看name2信息
    12. "lisi"
    13. 127.0.0.1:6379> get name2 # 过20秒再获取name2信息
    14. (nil)
    • 使用PERSIST 可以删除key的生存时间(不删除key)
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> expire name 20 # 设置过期时期
    6. (integer) 1
    7. 127.0.0.1:6379> persist name # 对key为name执行persist命令
    8. (integer) 1
    9. 127.0.0.1:6379> get name # 获取name信息
    10. "lisi"
    11. 127.0.0.1:6379> get name # 过20秒再获取name信息
    12. "lisi"
    • 多次对同一个KEY执行 EXPIRE 命令,后面的生存时间覆盖之前的生存时间
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> expire name 50
    6. (integer) 1
    7. 127.0.0.1:6379> expire name 20
    8. (integer) 1
    9. 127.0.0.1:6379> expire name 5
    10. (integer) 1
    11. 127.0.0.1:6379> get name
    12. "lisi"
    13. 127.0.0.1:6379> get name # 过5秒后查name信息
    14. (nil)

    时间复杂订O(1)。

    返回:

    • 生成返回1
    • 失败返回0

    PERSIST 移除给定KEY的生存时间

    PERSIST key:将这个 key 从(带生存时间 key )的过期时间删除

    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> expire name 10
    6. (integer) 1
    7. 127.0.0.1:6379> persist name
    8. (integer) 1
    9. 127.0.0.1:6379> ttl name
    10. (integer) -1 # name的过期时间已清除,所以返回-1
    11. 127.0.0.1:6379> persist name
    12. (integer) 0
    13. 127.0.0.1:6379> persist name1
    14. (integer) 0

    时间复杂度O(1)。

    返回:

    • 当生存时间移除成功时,返回 1 
    • key 不存在或 key 没有设置生存时间,返回 0 

    EXPIREAT 设置过期时间-时间戳

    EXPIREAT key timestamp:操作与EXPIRE相似

    • 不同点:EXPIREAT的过期时间单位为时间戳,而EXPIRE的过期时间单位为秒

    TTL 获取剩余过期时间

    TTL key:以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)

    1. 127.0.0.1:6379> set name lisi ex 20
    2. OK
    3. 127.0.0.1:6379> ttl name
    4. (integer) 18
    5. 127.0.0.1:6379> ttl name
    6. (integer) 6
    7. 127.0.0.1:6379> ttl name
    8. (integer) -2
    9. 127.0.0.1:6379> get name
    10. (nil)

    时间复杂度O(1)

    返回值:

    • 当 key 不存在时,返回 -2
    • 当 key 存在但没有设置剩余生存时间时,返回 -1 
    • 否则,以秒为单位,返回 key 的剩余生存时间

    PTTL 获取剩余过期时间

    PTTL key:操作类似于TTL

    • 不同点:PTTL以毫秒为单位返回,而TTL以秒为单位返回

    RENAME 重命名KEY

    RENAME key newkey:将 key 改名为 newkey 

    • 当 key 不存在时,返回一个错误
    • 当 newkey 已经存在时, RENAME 命令将覆盖旧值
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> rename name address # key不存在
    4. (error) ERR no such key
    5. 127.0.0.1:6379> set name lisi
    6. OK
    7. 127.0.0.1:6379> rename name name2 # 执行rename命令
    8. OK
    9. 127.0.0.1:6379> set address guiyang
    10. OK
    11. 127.0.0.1:6379> keys *
    12. 1) "address"
    13. 2) "name2"
    14. 127.0.0.1:6379> rename name2 address # 执行rename命令
    15. OK
    16. 127.0.0.1:6379> keys * # newkey已存在,直接覆盖,只剩下address一个key
    17. 1) "address"
    18. 127.0.0.1:6379> get address
    19. "lisi"

    时间复杂度O(1)。

    返回值:

    • 改名成功时提示 OK 
    • 失败时候返回一个错误

    RENAMENX 重命名KEY

    RENAMENX key newkey:操作与RENAME相似

    • 不同点:当且仅当 newkey 不存在时,将 key 改名为 newkey

    EXISTS 判断KEY是否存在

    EXISTS key:检查给定 key 是否存在

    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> exists name
    4. (integer) 0
    5. 127.0.0.1:6379> set name lisi
    6. OK
    7. 127.0.0.1:6379> exists name
    8. (integer) 1

    时间复杂度O(1)。

    返回:

    • 若 key 存在,返回 1 ,否则返回 0 

    KEYS 按模式匹配KEY

    KEYS pattern:查找所有符合给定模式 pattern 的 key

    • KEYS * :匹配数据库中所有 key(不推荐使用该命令)
    • KEYS h?llo :第二个字符字符匹配一个任何字符。如 匹配 hello,hallo 和 hxllo 等
    • KEYS h*llo :匹配第一个字符和最后三个字符,中间匹配任意字符。如 hllo 和 heeeeello 等
    • KEYS h[ae]llo: 第二个字符为a或e。如 hello 和 hallo ,但不匹配 hillo
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set hello 1
    4. OK
    5. 127.0.0.1:6379> set hallo 2
    6. OK
    7. 127.0.0.1:6379> set hxllo 3
    8. OK
    9. 127.0.0.1:6379> set hillo 4
    10. OK
    11. 127.0.0.1:6379> set habcdello 5
    12. OK
    13. 127.0.0.1:6379> keys *
    14. 1) "habcdello"
    15. 2) "hallo"
    16. 3) "hello"
    17. 4) "hillo"
    18. 5) "hxllo"
    19. 127.0.0.1:6379> keys h?llo
    20. 1) "hallo"
    21. 2) "hello"
    22. 3) "hillo"
    23. 4) "hxllo"
    24. 127.0.0.1:6379> keys h*llo
    25. 1) "habcdello"
    26. 2) "hallo"
    27. 3) "hello"
    28. 4) "hillo"
    29. 5) "hxllo"
    30. 127.0.0.1:6379> keys h[ae]llo
    31. 1) "hallo"
    32. 2) "hello"

    时间复杂度为O(N), N 为数据库中 key 的数量

    返回:

    • 符合给定模式的 key 列表

    SORT 排序

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

    • 返回或保存给定列表、集合、有序集合 KEY 中经过排序的元素
    • 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较
    • 默认排序对象为数字

    SORT key asc|desc 数字排序

    1. 127.0.0.1:6379> lpush mylist 2 4 3 1
    2. (integer) 4
    3. 127.0.0.1:6379> sort mylist # 默认为 asc
    4. 1) "1"
    5. 2) "2"
    6. 3) "3"
    7. 4) "4"
    8. 127.0.0.1:6379> sort mylist desc
    9. 1) "4"
    10. 2) "3"
    11. 3) "2"
    12. 4) "1"

    SORT key alpha 字符串排序

    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> lpush mylist a g b e j
    4. (integer) 5
    5. 127.0.0.1:6379> sort mylist
    6. (error) ERR One or more scores can't be converted into double # 字符串排序报错
    7. 127.0.0.1:6379> sort mylist alpha # 添加alpha进行对字符串排序
    8. 1) "a"
    9. 2) "b"
    10. 3) "e"
    11. 4) "g"
    12. 5) "j"

    sort key limit start size 限制返回数量

    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> lpush mylist a g b e j
    4. (integer) 5
    5. 127.0.0.1:6379> sort mylist asc alpha limit 0 2
    6. 1) "a"
    7. 2) "b"
    • start:开始位置
    • size:数量

    DUMP 序列化给定 KEY

    DUMP key:序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键

    • 它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查校验和
    • 值的编码格式和 RDB 文件保持一致
    • RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作
    1. 127.0.0.1:6379> flushdb # 清空库
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> dump name # dump存在的key
    6. "\x00\x04lisi\t\x00\xd2p\xcc\xfe6\x8d\xd9\x15"
    7. 127.0.0.1:6379> dump age # dump不存在的key
    8. (nil)

    时间复杂度:

    • 查找给定键的复杂度为 O(1) 
    • 对键进行序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小
    • 若序列化的对象是比较小的字符串,那么复杂度为 O(1)

    返回值:

    • 返回序列化之后的值
    • 若 key 不存在,那么返回 nil

    RESTORE 反序列化给定 KEY

    RESTORE key ttl serialized-value:反序列化给定的序列化值,并将它和给定的 key 关联

    • 参数 ttl 以毫秒为单位为 key 设置生存时间;如果 ttl 为 0 ,那么不设置生存时间
    • 反序列化前校验RDB版本的数据完整性,版本不同或不完整报错
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> dump name # 序列化
    6. "\x00\x04lisi\t\x00\xd2p\xcc\xfe6\x8d\xd9\x15"
    7. 127.0.0.1:6379> restore name2 0 "\x00\x04lisi\t\x00\xd2p\xcc\xfe6\x8d\xd9\x15" # 反序列化
    8. OK
    9. 127.0.0.1:6379> keys *
    10. 1) "name2"
    11. 2) "name"
    12. 127.0.0.1:6379> get name
    13. "lisi"
    14. 127.0.0.1:6379> get name2
    15. "lisi"
    16. 127.0.0.1:6379> restore name2 0 "\x00\x04lisi\t\x00\xd2p\xcc\xfe6"
    17. (error) BUSYKEY Target key name already exists. # 序列化值不完整,报错

    时间复杂度

    • 查找给定键的复杂度为 O(1) ,对键进行反序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小。
    • 有序集合(sorted set)的反序列化复杂度为 O(N*M*log(N)) ,因为有序集合每次插入的复杂度为 O(log(N)) 。
    • 如果反序列化的对象是比较小的字符串,那么复杂度为 O(1) 

    返回值:

    • 反序列化成功,返回OK
    • 否则报错

    OBJECT 查看KEY内部存储信息

    OBJECT subcommand [arguments [arguments]]:允许从内部察看给定 key 的 Redis 对象

    • 通常用在除错或者了解为了节省空间而对 key 使用特殊编码的情况
    • 将Redis用作缓存程序时,你也可以通过 OBJECT 命令中的信息,决定 key 的驱逐策略(eviction policies)

    子命令:

    • OBJECT REFCOUNT  返回给定 key 引用所储存的值的次数。此命令主要用于除错
    • OBJECT ENCODING  返回给定 key 锁储存的值所使用的内部表示(representation)
    • OBJECT IDLETIME  返回给定 key 自储存以来的空转时间(idle, 没有被读取也没有被写入),以秒为单位
    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> set age 20
    6. OK
    7. 127.0.0.1:6379> set code 123456789901234567890
    8. OK
    9. 127.0.0.1:6379> lpush mylist 1 2 3 4 5 b c d e f g h j
    10. (integer) 13
    11. 127.0.0.1:6379> hset myhash name lisi age 20 address 'guiyang'
    12. (integer) 3
    13. 127.0.0.1:6379> sadd myset 1 2 3 a b c d e f hello world
    14. (integer) 11
    15. 127.0.0.1:6379> zadd mysset 1 a 3 c 2 d 5 5 6 1a
    16. (integer) 5
    17. 127.0.0.1:6379> object encoding name
    18. "embstr" # 字符串
    19. 127.0.0.1:6379> object encoding age
    20. "int" # 数字
    21. 127.0.0.1:6379> object encoding code
    22. "embstr" # 大的数字被编码为字符串
    23. 127.0.0.1:6379> object encoding mylist
    24. "quicklist" # 列表
    25. 127.0.0.1:6379> object encoding myhash
    26. "ziplist" # 集合
    27. 127.0.0.1:6379> object encoding myset
    28. "hashtable" # hash
    29. 127.0.0.1:6379> object encoding mysset
    30. "ziplist" # 有序集合

    时间复杂度为O(1)。

    返回值:

    • OBJECT REFCOUNT key 返回数字
    • OBJECT IDLETIME key 返回数字
    • OBJECT ENCODING key 返回相应的编码类型

    TYPE 查值的类型

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

    1. 127.0.0.1:6379> flushdb
    2. OK
    3. 127.0.0.1:6379> set name lisi
    4. OK
    5. 127.0.0.1:6379> set age 20
    6. OK
    7. 127.0.0.1:6379> set code 123456789901234567890
    8. OK
    9. 127.0.0.1:6379> lpush mylist 1 2 3 4 5 b c d e f g h j
    10. (integer) 13
    11. 127.0.0.1:6379> hset myhash name lisi age 20 address 'guiyang'
    12. (integer) 3
    13. 127.0.0.1:6379> sadd myset 1 2 3 a b c d e f hello world
    14. (integer) 11
    15. 127.0.0.1:6379> zadd mysset 1 a 3 c 2 d 5 5 6 1a
    16. (integer) 5
    17. 127.0.0.1:6379> type address
    18. none
    19. 127.0.0.1:6379> type name
    20. string # 字符串
    21. 127.0.0.1:6379> type age
    22. string # 字符串
    23. 127.0.0.1:6379> type code
    24. string # 字符串
    25. 127.0.0.1:6379> type mylist
    26. list # 列表
    27. 127.0.0.1:6379> type myhash
    28. hash # 哈希
    29. 127.0.0.1:6379> type myset
    30. set # 集合
    31. 127.0.0.1:6379> type mysset
    32. zset # 有序集合

    时间复杂度O(1)。

    返回:

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

    PS:还有 SCAN迭代键、RANDOMKEY随机返回键、MIGRATE原子键跨实例移动、MOVE库之间移动等命令几乎用不上,有需要的同学请移步到官网查阅https://redis.io
     

  • 相关阅读:
    k8s之service
    数组对象中某个值累加reduce
    架构学习之通用定时器
    031:vue子组件向父组件传递多个参数,父组件2种解析方法
    解决maven 不支持http问题
    [IAGC] Kafka消费者组的负载均衡策略
    vue 基于element-plus el-button封装按钮组件
    【Redis入门笔记 05】Jedis 简介 & SpringBoot 集成
    202212 青少年等级考试机器人实操真题三级
    基于SpringBoot的靓车汽车销售网站
  • 原文地址:https://blog.csdn.net/imwucx/article/details/133039041