有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
文章目录
- 1. 概述
- 2. 常用命令
- 2.1 KEYS
- 2.2 DEL
- 2.3 EXISTS
- 2.4 EXPIRE
- 2.5 TTL
- 2.6 RENAME
- 2.7 TYPE
- 2.8 PERSIST
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 | PEXPIRETIME与EXPIRETIME具有相同的语义,但以毫秒而不是秒为单位返回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匹配hello、hallo、hxllohh*llo匹配hllo、heeeellohh[ae]llo匹配hello、hallo,不匹配hillohh[^e]llo匹配hallo,hbllo...不匹配hellohh[a-b]llo匹配hallo、hbllo
示例:
# 创建一些 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 返回 1 或 0 。
注意事项:
- 如果相同的
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:设置超时成功0:key不存在
基本语法:
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 的剩余过期时间。
返回值
-2:key不存在返回-1:key存在但是没有关联超时时间返回- 正整数: 剩余超时秒数
基本语法:
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
注意事项:
- 在集群模式下,
key和newkey需要在同一个hash slot。key和newkey有相同的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