个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创Redis 基本全局命令
收录于专栏[redis]
本专栏旨在分享学习Redis的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
KEYS
EXISTS
DEL
EXPIRE
TTL
TYPE
Redis 有 5 中数据结构,但它们都是键值对中的值,对于键来说有一些通用的命令。
KEYS
返回所有满足样式(pattern)的key。支持如下统配样式。
• h?llo 匹配 hello , hallo 和 hxllo
• h*llo 匹配 hllo 和 heeeello
• h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo
• h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello
• h[a-b]llo 匹配 hallo 和 hbllo
语法:
KEYS pattern
命令有效版本:1.0.0 之后
时间复杂度:O(N)
返回值:匹配 pattern 的所有 key。
示例:
MSET:将多个键值对一次性存储到 Redis 中。如果指定的某个键已经存在,MSET 会覆盖它的值。如果某个键对应的值不存在,MSET 会新建该值。
注意:
keys 命令的时间复杂度是 O(N)
所以,在生产环境中,一般都会禁用 keys 命令,尤其是大杀器 keys * => 查询所有的 key!
因为生产环境中 key 可能会非常多!而 redis 是一个单线程的服务器,执行 keys* 的时间非常长,就使 redis 服务器被阻塞了,无法给其他客户端提供服务!
这样的后果可能是灾难性的~
redis 经常用于做缓存,挡在 mysql 前面,替 mysql 负重潜行的人,万一 redis 被一个 keys* 阻塞住了,此时其他的查询 redis 操作就超时了,此时这些请求就会直接查数据库,突然一大波请求过来了,mysql 措手不及,就容易挂了,整个系统就基本瘫痪了。如果你要是没能及时发现,及时恢复的话。。。
EXISTS
判断某个 key 是否存在。
语法:
EXISTS key [key ...]
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:key 存在的个数。
示例:
注意:
分开的写法,会产生更多轮次的网络通信。
进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层,到物理层,层层封装。(每一层协议都要加上报头或者尾)=> 发一个快递,要包装一下,要包装很多层,接收方收到一个数据,这个数据就要从物理层,到应用层层层分用(把每一层协议中的报头或者尾给拆掉)=> 收到一个快递,要拆快递,要拆很多层。
DEL
删除指定的 key。
语法:
DEL key [key ...]
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:删除掉的 key 的个数
示例:
Redis VS MySQL 的区别:
之前学 MySQL 的时候,当时强调,删除类的操作:
drop database
drop table
delete from...
都是非常危险的操作!!
一旦删除之后,数据就没有了~
此时 redis 里存放的只是一个热点数据,全量数据是在 MySQL 数据库中。
此时,如果把 redis 中的 key 删除了几个,一般来说,问题不大~
但是,当然如果把所有的数据或者一大半数据一下都干没,这种影响会很大。(本来 redis 是帮 MySQL 负重前行,redis 没数据了,大部分的请求就直接打给 MySQL 然后就容易把 MySQL 搞挂)
相比之下,如果是 MySQL 这样的数据,哪怕误删了一个数据,都是可能影响很大的~
如果是把 redis 作为数据库,此时误删数据的影响就很大了
如果是把redis 作为消息队列(mq),这种情况误删数据影响不大,就需要具体分析了。
EXPIRE
为指定的 key 添加秒级过期时间(Time to live TTL)
语法:
EXPIRE key seconds
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:1表示设置成功。0 表示设置失败
示例:
TTL
获取指定 key 的过期时间,秒级。
语法:
TTL key
命令有效时间:1.0.0 之后
时间复杂度:O(1)
返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在
示例:
一个 redis 中可能同时存在很多很多 key,这些 key 中可能很大一部分有过期时间,此时 redis 服务器咋知道哪些 key 已经过期要被删除,哪些 key 还没有过期??
redis 的整体策略是 :
1. 定期删除:
每次抽取一部分,进行验证过期时间,保证这个抽取检查的过程足够快!因为 redis 是单线程的程序,主要的任务(处理每个命令的任务)如果扫描过期 key 消耗的时间太多了,就可能导致正常处理请求被阻塞了。(产生了类似于执行 keys * 这样的效果)
2. 惰性删除
假设这个 key 已经到过期时间了,但是暂时还没删它,key 还存在
紧接着,后面依次访问,正好用到了这个 key,于是这次访问就会让 redis 服务器触发删除 key 的操作,同时再返回一个 nil。
3. redis 为了对上述进行补充,还提供了一系列的内存淘汰策略,后面讲
TYPE
返回 key 对应的数据类型。
语法:
TYPE key
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:none,string,list,set,zset,hash and stream。
示例:
本章只是抛砖引玉,给出几个通用的命令,为5中数据结构的使用做一个热身,后续我将对键管理做一个更为详细的介绍。感兴趣的宝子们千万不要错过啊~~