Redis 7.x 系列【5】 基础命令

发布于:2024-06-30 ⋅ 阅读:(210) ⋅ 点赞:(0)

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

1. 概述

Redis 作为 KV 型数据库,基础命令则主要包含了针对 Key 的相关操作,7.x 版本包含的所有命令如下所示:

命令
COPY 将存储在 key 处的值复制到目标 key
DEL 用于删除 key
DUMP 序列化给定 key ,并返回被序列化的值
EXISTS 检查给定 key 是否存在
EXPIRE 为给定 key 设置过期时间
EXPIREAT 用于为 key 设置过期时间,接受的时间参数是 UNIX 时间戳
EXPIRETIME key 将在该时间到期,返回 UNIX 时间戳
KEYS 查找所有符合给定模式的 key
MIGRATE key 原子性地从当前实例传送到目标实例的指定数据库上
MOVE 将当前数据库的 key 移动到给定的数据库中
OBJECT ENCODING 查看存储在 key 中的对象的内部编码
OBJECT FREQ 查看存储在 key 中的对象的对数访问频率计数器
OBJECT IDLETIME 查询自上次访问 key 中存储的值以来的时间(以秒为单位)
OBJECT REFCOUNT 查看存储在 key 的引用计数
PERSIST 移除 key 的过期时间,key 将持久保持
PEXPIRE 设置 key 的过期时间,以毫秒计
PEXPIREAT 设置 key 过期时间的时间戳(unix timestamp),以毫秒计
PEXPIRETIME PEXPIRETIMEEXPIRETIME具有相同的语义,但以毫秒而不是秒为单位返回Unix的绝对过期时间戳
PTTL 以毫秒为单位返回 key 的剩余的过期时间
RANDOMKEY 从当前数据库中随机返回一个 key
RENAME 修改 key 的名称
RENAMENX 仅当 newkey 不存在时,将 key 改名为 newkey
RESTORE 反序列化给定的序列化值(由 DUMP 生成),并将它和给定的 key 关联
SCAN 迭代数据库中的 key
SORT 对元素进行排序并显示排序结果,不影响这些类型里面存储的数据的排序
SORT_RO SORT命令的只读变体
TOUCH 更改 key 的最后访问时间
TTL 以秒为单位,返回给定 key 的剩余生存时间
TYPE 返回 key 所储存的值的类型
UNLINK 异步删除一个或多个 key
WAIT 用于阻塞客户端,直到之前的写命令已被写到指定数量的副本为止
WAITAOF 用于阻塞客户端,直到之前所有写命令已被同步到 AOF 文件为止

2. 常用命令

2.1 KEYS

KEYS 命令用于查找所有匹配给定模式的 key ,返回匹配的 key 的列表。操作的时间复杂度是 O(N),但是常量时间相当小,在一个普通笔记本上扫描 100 万个 key 只要 40 毫秒。适合用来调试和特殊操作,比如改变键空间布局。

注意事项:

  • 生产环境谨慎使用,数据量很大时会影响性能。
  • 不要在代码中使用 KEYS ,如果你需要一个寻找键空间中的 key子集,考虑使用 SCAN命令 或 Set 集合。

基本语法:

KEYS pattern

匹配模式:

  • h?llo 匹配 hellohallohxllo
  • hh*llo 匹配 hlloheeeello
  • hh[ae]llo 匹配 hello hallo,不匹配 hillo
  • hh[^e]llo 匹配 hallo, hbllo... 不匹配 hello
  • hh[a-b]llo 匹配 hallohbllo

示例:

# 创建一些 key 并赋值
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
# 查找含有 name 的 key
redis> KEYS *name*
1) "firstname"
2) "lastname"
# 查找以 a 为开头长度为 3 的 key
redis> KEYS a??
1) "age"
# redis 获取所有的 key 使用 *。
redis> KEYS *
1) "firstname"
2) "lastname"
3) "age"

2.2 DEL

DEL 命令用于删除给定的一个或多个 key ,不存在的 key 会被忽略,返回值为被删除 key 的数量。

基本语法:

DEL key [key ...]

示例:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> SET key3 "redis.com.cn"
"OK"
redis> DEL key1 key2 key3 key4
(integer) 3

2.3 EXISTS

DEL 命令用于检查给定 key 是否存在,检查多个 key 返回值为存在的 key 的个数,检查单个 key 返回 10

注意事项:

  • 如果相同的 key 在参数列表中出现了多次,它会被计算多次。所以,如果somekey存在,EXISTS somekey somekey 命令返回 2

基本语法:

EXISTS key [key ...]

示例:

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

2.4 EXPIRE

EXPIRE 命令用于设置 key 的过期时间(秒),设置的时间过期后,key 会被自动删除,带有超时时间的 key 通常被称为易失的。

注意事项:

  • 已经设置过期的 key,可以调用 EXPIRE 重新设置。在这种情况下 key 的生存时间被更新为新值。
  • 已存在的旧 key 使用 RENAME 改名,那么新 key 会继承所有旧 key 的属性。key 使用 RENAME 改名后,过期时间被转移到新 key 上。
  • 通过使用 PERSIST 命令把 key 改回持久的 key,这样 key 的过期时间也可以被清除。
  • 超时时间只能使用删除 key 或者覆盖 key 的命令清除,包括 DEL, SET, GETSE 和所有的 *STORE 命令。
  • 对于修改 key 中存储的值,而不是用新值替换旧值的命令,不会修改超时时间。
  • 使用 EXPIRE/PEXPIRE 设置的过期时间为负数,或者使用EXPIREAT/PEXPIREAT设置过期时间戳为过去的时间会导致 key 被删除。
  • key 的过期时间以绝对 Unix 时间戳的方式存储。这意味无论 Redis 是否运行,过期时间都会流逝。
  • 服务器的时间必须稳定准确,这样过期时间才能更准确。如果在两个时间相差较多的机器之间移动 RDB 文件,那么可能会出现所有的 key 在加载的时候都过期了。
  • 运行的 Redis 也会不停的检查服务器的时间,如果你设置一个带有 1000 秒过期时间的key,然后你把服务器的时间向前调了 2000 秒,那么这个 key 会立刻过期,不是等 1000 秒后过期。

返回值:

  • 1 :设置超时成功
  • 0key 不存在

基本语法:

EXPIRE key seconds

典型应用场景:

  • 会话 Session
  • 短信验证码

示例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
"OK"
redis> TTL mykey
(integer) -1

过期策略:

  • 懒惰删除:用户访问某个 key 的时候,如果过期了就立即删除。如果一个 key 已经过期了,如果长时间没有被访问,那么这个 key 就会一直存留在内存之中,严重消耗了内存资源。
  • 定期删除:将所有设置了过期时间的 key放入一个字典中,然后每隔一段时间从字典中随机一些 key检查过期时间并删除已过期的 key。同时,为了保证不出现循环过度的情况,Redis 还设置了扫描的时间上限,默认不会超过 25ms

2.5 TTL

TTL 命令以秒为单位返回 key 的剩余过期时间。

返回值

  • -2key 不存在返回
  • -1key 存在但是没有关联超时时间返回
  • 正整数: 剩余超时秒数

基本语法:

TTL key

示例:

redis> SET mykey "Hello"
"OK"
# key 存在,但没有设置剩余生存时间
redis> TTL mykey
(integer) -1
redis> EXPIRE mykey 10
(integer) 1
# 有剩余生存时间的 key
redis> TTL mykey
(integer) 10

2.6 RENAME

RENAME 命令用于修改 key 的名字为 newkey ,若 key 不存在返回错误。

基本语法:

RENAME key newkey

注意事项:

  • 在集群模式下,keynewkey 需要在同一个 hash slotkeynewkey 有相同的 hash tag 才能重命名。
  • 如果 newkey 存在则会被覆盖,此种情况隐式执行了 DEL 操作,所以如果要删除的 key 的值很大会有一定的延时,即使 RENAME 本身是常量时间复杂度的操作。

示例:

# key 存在且 newkey 不存在
redis> SET mykey "Hello"
"OK"
redis> RENAME mykey myotherkey
"OK"
redis> GET myotherkey
"Hello"
# 当 key 不存在时,返回错误
redis> RENAME fake_key never_exists
ERR 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)
# 原来的值 dell 被覆盖了
redis> GET personal_computer
"lenovo"

2.7 TYPE

TYPE 命令用于以字符串的形式返回存储在 key 中的值的类型, key 不存在时返回 none

基本语法:

TYPE key

示例:

redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

2.8 PERSIST

PERSIST 命令用于删除给定 key 的过期时间,使得 key 永不过期。

基本语法:

PERSIST KEY_NAME

返回值:

  • 1 :当过期时间移除成功时
  • 0 :如果 key 不存在或 key 没有设置过期时间

示例:

redis> SET mykey "Hello"
"OK"
# 为 key 设置生存时间
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
# 移除 key 的生存时间
redis> PERSIST mykey
(integer) 1
redis> TTL mykey
(integer) -1

网站公告

今日签到

点亮在社区的每一天
去签到