Redis—全局命令
- 🔎get / set
- 🔎常用全局命令
- keys
- exists
- del
- expire
- ttl
- key 的过期策略
- type
Redis 官网
Redis 中的命令不区分大小写
进入 Redis 客户端
redis-cli -h Redis 服务器的 IP 地址 -p Redis 服务器的端口号
- 省略 -h 表示 Redis 服务器的 IP 地址为 localhost
- 省略 -p 表示 Redis 服务器的端口号为 6379
redis-cli
🔎get / set
Redis 是按照键值对的方式存储数据
- get, 根据 key 获取对应的 value
- set, 存储 key 和 value
语法
set key value
get key
示例
set mouse keyboard
get mouse
如果 get 的 key 值不存在, 则会返回 nil
你可以将 nil 理解为 null
🔎常用全局命令
Redis 是键值对结构, key 是固定字符串
value 有多种类型, 包括
- 字符串
- 哈希表
- 列表
- 集合
- 有序集合
- …
针对不同的数据结构, 会有不同的操作命令
全局命令, 即能够搭配任意一个数据结构进行使用
keys
keys 用于查询当前服务器上匹配的 key
通过一些特殊符号描述所要匹配的 key
语法
keys pattern
示例
keys h?llo
keys h*llo
keys h[abc]llo
keys h[^abc]llo
keys h[a-e]llo
pattern, 即要匹配的 key 的样式
解释🍂
h?llo, ? 表示任意一个字符
h*llo, * 表示任意多个字符
h[abc]llo, 表示仅匹配[]中的内容. 即匹配 hallo, hbllo, hcllo
h[^abc]llo, 表示仅排除[]中的内容. 即排除 hallo, hbllo, hcllo
h[a-e]llo, 表示匹配 hallo, hbllo, hcllo, ..., hello
注意🍂
keys pattern 命令的时间复杂度是 O(N)
因此在生产环境中一般禁止使用 keys pattern 命令(尤其是 keys * → 匹配所有)
这是因为在生产环境中 key 可能会非常多, 而 Redis 是一个单线程服务器, 执行 keys * 的时间较长, 这样就会导致 Redis 服务器被阻塞, 从而无法向其他客户端提供服务
我们知道, Redis 经常用于缓存存储热点数据, 替代 MySQL 负重前行
如果 Redis 被 keys * 操作阻塞, 那么请求就会直接查询数据库, 就容易导致 MySQL 挂了
对于生产环境的解释🍂
生产环境, 一般又称为线上环境, 外界用户能够访问
(办公环境, 开发环境, 测试环境一般统称为线下环境, 外界用户无法访问)
生产环境出现问题, 一定会影响用户的使用
exists
exists 用于判断某个 key 是否存在
返回值为 key 存在的个数
语法
exists key
示例
判断某一个 key 是否存在
exists hello
exists hi
判断多个 key 是否存在
exists hello hi
Redis 是一个客户端服务器结构的程序. 而客户端, 服务器之间通过网络进行通信
因此在判断多个 key 是否存在时尽量写成 exists hello hi
这样的形式
避免写成 exists hello
+ exists hi
这样的形式
注意🍂
exists key 命令的时间复杂度是 O(1)
Redis 中的键值对通过哈希表的方式组织, 其中的 value 支持很多的数据结构类型
因此 exists key 命令为 O(1)
del
del(delete) 用于删除指定的 key
返回值为删除的 key 的个数
语法
del key
示例
删除指定的一个 key
del hello
del hi
删除指定的多个 key
del hello hi
删除指定的多个 key 时尽量写成 del hello hi
这样的形式
注意🍂
del key 命令的时间复杂度是 O(1)
expire
expire 用于给指定的 key 设置过期时间(前提是该 key 已经存在)
过期时间的单位是 s
返回值为 1, 表示设置成功
返回值为 0, 表示设置失败
语法
expire key
示例
expire hello
expire hi
注意🍂
expire key 命令的时间复杂度是 O(1)
ttl
ttl(time to live) 用于查看指定 key 的过期时间还剩多久
返回值表示剩余的过期时间
特殊的返回值
- -1, 表示未设置过期时间
- -2, 表示 key 不存在
语法
ttl key
示例
ttl hello
ttl hi
注意🍂
ttl key 命令的时间复杂度是 O(1)
key 的过期策略
Redis 中可能同时存在很多的 key, 这些 key 中可能一大部分都有过期时间
那么 Redis 如何确定哪些 key 是过期了的需要被删除, 哪些还没有过期呢
Redis 的主要策略是
- 惰性删除
- 定期删除
惰性删除🍂
假设某一个 key 已经过期, 但还没有删除
如果后面有一次访问正好需要这个 key, 于是这次访问就会触发 Redis 的删除操作, 再将对应的 key 值返回 nil
举个栗子🌰
A 去小卖部买薯片, 此时货架上就还剩一包 A 最爱吃的薯片
A 拿起薯片就去结账, 结账时看到薯片的生产时间, 保质期意识到薯片过期了
于是 A 告诉老板不买了, 老板便将过期的薯片下架
(惰性删除)
定期删除🍂
每次抽取一部分进行验证过期时间
需要保证校验过程足够快, 即校验的时间是一定的
举个栗子🌰
小卖部的老板不能总是让顾客发现商品有没有过期, 要不他这个小卖部就倒闭了
于是老板定期的检查货架上的商品有没有过期
但是老板年事已高, 心中无志. 不想将他的小卖部做大做强, 再创辉煌
于是老板每次都非常快速的检查一部分商品的过期时间, 然后继续抽着烟, 喝着酒, 烫着头~~
(定期删除)
为什么对于定期删除的时间有要求
这是因为 Redis 是单线程的程序, 其主要的任务是处理请求命令
如果扫描过期的 key 的时间过长, 就会阻塞正常的处理请求
type
type 用于查询 key 所对应 value 的类型
返回值包括
- none, 表示 key 不存在
- string
- list
- set
- zset
- hash
- stream, 当 redis 作为消息队列时使用的类型
- …
语法
type key
示例
type hello
type hi
注意🍂
type key 命令的时间复杂度是 O(1)
🌸🌸🌸完结撒花🌸🌸🌸