Redis 中的通用命令(高频率操作)
文章目录
- [Redis 中的通用命令(高频率操作)](#Redis 中的通用命令(高频率操作))
- [Redis 的数据类型](#Redis 的数据类型)
- [redis-cli 命令](#redis-cli 命令)
- [Keys 命令](#Keys 命令)
- [Exists 命令](#Exists 命令)
- [Expire 命令](#Expire 命令)
- [Ttl 命令](#Ttl 命令)
- Type命令
Redis 的数据类型
Redis 支持多种数据类型,整体来说,Redis 是一个键值对结构的,它的 key 固定是字符串类型,而 value 支持 字符串、哈希表、列表、集合、有序集合 等几种数据类型,操作不同的数据时就需要用到不同的命令,但是也有一些全局的命令 在这几种数据类型中都可以使用,命令如下:
redis-cli 命令
在Linux 上通过 redis-cli 即可启动 Redis 客户端,如下图:
(如果要退出redis客户端的话直接 Ctrl + d)
通过 redis-cli 命令就可以连接到我们电脑上的 redis 客户端,也可以通过指定 ip 地址来连接其他主机上的 redis 客户端,如下图:
通过 -h 选项指定主机地址,通过 -p 选项指定端口号
Keys 命令
keys 命令 用来查询服务器上匹配的 key(相当于模糊查询命令)
h?llo 将 ?替换成任意一个字符
h*llo 将 * 替换成0个或多个字符
h[ab]llo 只能匹配到 [] 指定的字符,别的字符都不行,相当于给出了固定的选项
h [ ^ x] llo []表示排除错误答案,除了匹配x,其他的任何字符都可以
h[a-b]llo 表示匹配到指定的字符
通过一些特殊符号,在服务上查找与之类似的key,这些特殊符号都有以下几种:
h?llo 将 ?替换成任意一个字符
h?llo 可以匹配到 hello/hxllo/hallo 等
操作演示:
- 设置三个key,分别为:hello、hallo、hbllo
- 使用 keys h?llo 进行模糊查询
h*llo 将 * 替换成0个或多个字符
h*llo 匹配到 h/hllo/heeeello
h[ab]llo 只能匹配到 [] 指定的字符,别的字符都不行,相当于给出了固定的选项
匹配到 hallo/hbllo
h [ ^ x] llo []表示排除错误答案,除了匹配x,其他的任何字符都可以
h [ ^ x] llo 可以匹配到 hello/hallo等,但是不会匹配到 hxllo,除了x其他的都可以
h[a-b]llo 表示匹配到指定的字符
h[a-b]llo 可以匹配到 hallo 或 hbllo
时间复杂度:O(n)
注意:Keys 的时间复杂度是 O(n),因为,它要遍历 Redis 中的所有数据,所以应该在生产环境上要慎重使用,尤其是 keys*,不要去使用,因为它会查询 Redis 中所有的 key,而 Redis 是一个单线程的服务器,执行 Keys * 的时间就比较长,就会造成 Redis 服务器被阻塞,无法给其他的客户端提供服务。
而 Redis 经常是用作缓存,是替 Mysql 冲锋陷阵的,万一 Redis 被Keys*给阻塞住了,此时其他的查询 Redis 的操作也就超时了,那么所有的查询请求就会给到 Mysql 上,此时突然一大波请求来到给到Mysql,就有可能给Mysql一个措手不及,给 Mysql 也搞挂了,此时就出现大问题了,如果没有及时的发现及时的恢复的话,会出现很大的问题!!!
Exists 命令
Exists key [key....] 查看 key 是否存在
**返回值:**key的个数
**时间复杂度:**O(k) 注意:这个k不是所有的数据,而是因为它是可以查看多个key是否存在的,所以这个k是要查询的key的数量
操作演示:
这里就出现一个问题:它可以一次查询多个 key,那么我一次查询多个 key 和 查询一个一个的 key 有什么区别吗?
答案:区别是很大的,首先呢,Redis 是 客户端-服务器 结构的,所以,是通过网络来通信的,而一次查询多个 key 时,只需要向服务器发送一次请求即可,而一次查询一个,一个一个的查,是要发送多个请求的,而网络通信的效率是比较低,成本是比较高的。
del key [key....] 删除 key
返回值:成功删除 key 的个数
**时间复杂度:**O(k) ,注意这个k不是所有的数据,而是因为它是可以查看多个key是否存在的,所以这个k是指定的 key 的数量。
操作演示:
Expire 命令
expire [key] seconds 给指定的key设置过期时间,时间单位是:秒。key 的存活时间超过这个值时就会自动删除
pexpire [key] 毫秒 给指定的key设置过期时间,时间单位是:毫秒
注意:这里设置过期时间,指定的 key 必须是已经存在的。
**返回值:**0或1,0 表示设置失败,1 表示设置成功。
时间复杂度是:O(1)
这种给 Redis 中的key设置过期时间的方式也常用于很多的场景,例如:给验证码设置过期时间,点外卖优惠券过期时间等
操作演示:
Ttl 命令
ttl [key] 获取指定key剩余的过期时间
**返回值:**剩余的过期时间/-1:没有设置过期时间/-2:没有指定的key
时间复杂度:O(1)
操作演示:
Redis 的过期策略是如何实现的?换句话说,一个Redis中的存在多个有过期时间的key,那么,Redis如何知道哪些key要被删除,哪些不被删除?(重要)
Redis 的过期策略整体是这两种方式相结合的:定期删除 和 惰性删除
惰性删除:假设有一个key的过期时间已经到了,但是暂时不会给他删除,先保留着,等到我们下次去访问这个key时,此时Redis服务器就会触发删除操作,将key删除,此时就返回一个 nil。
定期删除:定期的去扫描key,如果有过期的key,就进行删除,但是这里有一个问题就是,如果key非常多的话,扫描起来就比较浪费时间,所以,在这里对定期扫描的时间进行了要求,就是它在扫描检查的时候是一部分一部分抽取着扫描检查,以保证扫描检查的时间足够快。
这里为什么要对扫描的时间进行要求呢?
首先,Redis 是单线程执行任务的,Redis 主要的任务还要处理用户发来的命令,如果扫描key的时间太长,处理命令的任务就会被阻塞,所以,进行了要求。
以上两种方式,虽然可以对 key 进行删除,但是整体效果一般,它也可能会残留很多的key没有及时的删除掉。
Redis 为了删除操作进行补充,还提供了一系列的内存淘汰策略。
网上还有人说Redis有定时删除策略,这个说法是错误的,Redis 并没有采用定时删除策略
Type命令
type 查看key对应的数据类型
**返回值:**key 的数据类型
时间复杂度:O(1 )
操作演示:
再次明确,Redis 中,key 的类型固定就是 String,而 Value 的类型主要有以下几种:none, String,list,set,zset,hash,strem。这里面查看类型也就是查看 Value 的类型。