这是Redis最核心的两个命令,Redis是按照键值对存储数据的,set就是存进去key和value,get就是根据key查询value,如下图:
也可以使用 mset和mget,一次插入或查询多组键值对 :
使用还是比较简单的,至于set时后面还有一些选项,以后再讲
对于key和value,可以加双引号,也可以加单引号,也可以不加;并且Redis的命令也支持双击Tap键自动补全,也不区分大小写
keys是用来查询当前服务器上匹配的key,通过一些特殊符号(通配符)来描述key的模样,匹配上述模样的key就能被查询打印出来
pattern 表示包含特殊字符的字符串,可以翻译成“样式” 或者 “模式”,pattern可以有以下几种:
- 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 ( [-] 匹配范围内的字符,[a-z]这个就是匹配所有字母的)
keys * 是查询所有的key,将当前所有的key全部打印到屏幕上
注意:keys命令的时间复杂度是O(N),所以在生产环境上,一般都禁止使用keys,尤其是大杀器keys *的时间非常长,就使Redis服务器被阻塞了,无法给其它客户端提供服务,后果是灾难性的。
场景:redis经常用于做缓存,挡在MySQL前面替MySQL负重前行,万一redis被一个keys *阻塞住了,此时其它的查询redis操作就超时了,此时这些请求就会直接查MySQL,然后突然一大堆请求过来了,MySQL可能就会措手不及直接挂了,这样的话系统就基本瘫痪了,如果你要是没能及时发现并及时恢复的话,年终奖就没了,更严重工作也就那啥了。
上面提到了下生产环境,那么下面来谈谈以后工作会遇到的几种环境:
该命令负责判断一个或多个key是否存在,并返回个数
注意: 一次查三个,和三次查一个,乍一看没区别,但是区别很大很大
Redis是一个客户端 - 服务器结构的程序,两者之间是通过网络进行通信的,学习过计算机网络我们知道,我们输入一个命令,都是通过网络协议栈,将命令字符数据一层层往下封装各协议的报头形成报文再发送的,分开的exists的写法会产生更多轮次的网络通信,而网络通信的成本比较大的
再比如一个场景,你打电话给别人说“你好”两个字,我们可以打一次电话将两个字一次性说完,也可以打两次电话一次说一个字,那么这两种方式哪个快大家都知道哈
该命令的作用是删除指定的key,可以一次删多个
问题:Redis的删除是否和MySQL的删除一样,成本很大呢?
解答:影响不会很大。redis主要的作用是作为缓存,此时里面存的数据只是一个热点数据,全量数据还是存在mysql中的,热点数据也是会经常变化的,所以把redis中的几个key删除几个,影响不大。当然把所有数据或者一大半数据干掉了,问题还是有点大的。相比之下,mysql的drop和delete from,代价是很大的。
如果是把redis作为数据库MySQL作为缓存,上面的情况就反过来了
主要作用是用来给key设定过期时间,单位为秒,因为上面也说了热点数据会经常变化,所以我们可以使其自动化。
key的存活时间超过这个指定的值,就会被自动删除,有用且实用,很多业务场景有时间限制的,比如手机号验证码,外卖优惠券,都是在指定时间内有效
还有基于redis实现一个分布式锁,以前多线程的锁,都是在一个主机的一个程序里,分布式系统就是多个主机多个程序了,再需要互斥效果的话就所以需要分布式互斥锁,往redis里面写一个特殊的key value。为了避免出现不能正确解锁的情况, 通常都会在加锁的时候设置一下过期时间
还有以秒为单位对主机来说太慢了,我们可以使用pexpire,这个单位就是毫秒了
这个命令作用是查key的过期时间还剩多少,当返回-2时表示key不存在或已经过了过期时间被删除了:
在IP协议的报头字段中,有一个字段就是TTL,表示该报文能够跳转的路由器的最大个数,IP中的TTL表示次数,不是时间,和这个ttl不一样
一个redis可能同时存在很多key,这些key也有很大一部分有过期时间,那么redis服务器咋知道那些key已经过期要被删除,哪些还没过期呢?
问题:为啥对于定期删除的时间要有明确要求呢?
解答:因为Redis是单线程的程序,主要的任务还是处理命令任务,还有刚才扫描过期key,如果扫描消耗时间太久了,会导致前者正常处理命令被阻塞,产生类似执行key * 这样的效果
虽然有了上述两种策略结合,但整体的效果一般,仍然可能会有很多过期的key残留,所以Redis还提供了一系列的内存淘汰策略,后面再细讲
该命令用于查看key对应的value的数据类型
lpush插入链表value,再type就是list类型在redis中,操作不同数据结构使用的命令差别是很大的
上一篇:xpsp1补丁包-XPSP1 补丁包:见证电脑时代的记忆,解决系统漏洞与安全问题
下一篇:【解决方法总结】windows系统 突然进不去服务器了-vscode卡在“下载服务器”和“使用 scp 将 vscode 服务器复制到主机”