Redis通用命令
通过Redis-cli客户端和Redis服务器交互涉及到很多Redis的命令,掌握常用命令以及学会使用Redis文档
Redis中最核心的两个命令
get和set
Redis是按照键值对的方式举行存储
get 根据key来取value
set 把key和value存储进去
必须先进入redis-cli客户端,才气输入redis命令
https://i-blog.csdnimg.cn/direct/8f781d269a6c4f9a9131e0ab2de20f35.png
set key value
key value都得是字符串,尽管是字符串,但并不必要双引号,如果加上引号也是可以的,‘“均可以
https://i-blog.csdnimg.cn/direct/06027ef1e53b48e08b0df47bfd6c6984.png
https://i-blog.csdnimg.cn/direct/5f4c28125c804805b1591bfe39b7571f.png
redis命令不区分大小写https://i-blog.csdnimg.cn/direct/7438944ba8b14cf9b635b59aebdc689f.png
get命令同样get key1获得value1https://i-blog.csdnimg.cn/direct/1952998edadb41338ac703191ee19cf5.png
如果当前get key,key不存在,那么会返回nilhttps://i-blog.csdnimg.cn/direct/28fd9617707b4acb9a7a758da241377d.png
Redis全局命令-keys命令
Redis支持很多数据布局,整体上来说是键值对布局,key固定就是字符串,value实际上会有很多类型,例如字符串,哈希表,列表,聚集,有序聚集
操作不同的数据布局就会有不同的命令,所谓全局命令就是可以或许搭配任意数据布局
keys
keys-用来查询当前服务器上匹配的key
通过一些特别符号(通配符)来形貌key的模样,匹配上述模样的key就能查询出来
https://i-blog.csdnimg.cn/direct/67dd9ab9aee54da8884dd6b0a51f7071.png
pattern形貌了字符串符合的要求,来筛选了字符串
https://i-blog.csdnimg.cn/direct/051066ca36f04f26b5a8759a3d7580e3.png
pattern具体怎么写?支持怎样的通配符,
匹配规则
? 匹配任意一个字符
https://i-blog.csdnimg.cn/direct/9f646fab768346dbb99da8a6ac57b8eb.png
* 匹配0个或者任意一个字符
https://i-blog.csdnimg.cn/direct/8eb34347333a4e0c9406e045e22e7a6e.png
只能匹配a e,别的不可,相称于给出了具体的选项
https://i-blog.csdnimg.cn/direct/632b186d554a49b7a7d01655b745a9d6.png
[^e] 代表清除e,只有e清除不了,其他的都能匹配
https://i-blog.csdnimg.cn/direct/74068ae34da642e9a7dc7ded978c9e6a.png
只能是a至b这个范围内的字符,同时包括两侧界限
https://i-blog.csdnimg.cn/direct/ce9e4422715a4ed585aa638499433f6c.png
上述匹配规则,不消刻意背,实践才气牢记
留意事项:
keys命令的时间复杂度是O(N),因为要遍历整个key,以是在生产环境上少使用keys *命令,非常危险,生产环境上的key非常多,Redis是一个单线程的服务器,实行keys *服务器时间长,就使得redis服务器被阻塞了,无法给其他客户端提供服务
redis经常用于做缓存,挡在MySQL前,如果redis阻塞,此时其他查询redis操作就超时了,此时这些请求就会直接查询数据库,突然一大波请求过来了,MySQL措手不及,就容易挂了,整个系统就瘫痪了,如果未及时发现恢复,后果严重~(把工作带走)
生产环境(线上环境)
1.办公环境 笔记本,一般配置CPU8核,内存16G,硬盘512G
2.开辟环境 有的时候,办公环境和开辟环境是一个,有的时候,开辟环境是单独的服务器
做前端/客户端,一般来说,开辟环境就是办公环境了
有的后端步伐,会比较复杂
[*]编译一次时间特别长(C++),使用高性能的服务器,举行编译!!
[*]有的步伐一启动就要斲丧很多的cpu和内存资源,办公电脑难以支撑~~
[*]有的步伐比较依赖Linux,在Windows环境搭不起来
3.测试环境 测试工程师使用,单独服务器,配置较好
4.线上环境(生产环境) 上述环境均为线下环境->外界用户无法访问到
线上环境则是外界用户可以访问到,一旦生产环境出问题,会对用户/公司产生影响
exists
判定key是否存在
https://i-blog.csdnimg.cn/direct/bfff1ec610a64cf99b938716bef83ce7.png
返回值是key存在的个数,Redis不是键值对布局嘛?为什么有多个key?这里的Redis非常特别
时间复杂度为O(N) N代表着key对应的个数有N个 按照这些key按照哈希表的方式举行构造,以是和哈希表的查询复杂度一样,Redis支持很多数据布局,指的是一个Value可以是很多复杂的数据布局,Redis具体的某个值,又可以是一些数据布局
https://i-blog.csdnimg.cn/direct/2d0569f6e91647a9af69b9ab2a01ebe1.png
分两次查询和分一次查询有什么区别吗?切记,网络通讯效率低,开销大,以是一次请求响应比两次请求响应更加灵敏,
https://i-blog.csdnimg.cn/direct/bdcae6f6753c4183b842cf498e694597.png
封装和分用,举行网络通讯的时候,发送方发送一个数据,这个数据就要从应用层,到物理层,层层封装(每一次协议都要加上报头或者尾),吸收方收到一个数据,这个数据就要从物理层到应用层层层分层,网卡是IO装备,斲丧很大的开销,更何况,客户端和服务器不肯定在同一个主机上,以是Redis的很多命令都支持一次操作多个key的/支持多种操作
del
删除指定的key,可以一次删除多个key
https://i-blog.csdnimg.cn/direct/58f4f46c2b6c4cafa6cf97cd9c5dbdf4.png
时间复杂度为O(k),k为删除掉key的个数
返回值:删除掉key的个数
https://i-blog.csdnimg.cn/direct/32cdb7ace6cf4de0a33eb9b4db750c8d.png
在Redis中删除数据很严重吗?Redis主要的应用场景就是作为缓存,此时Redis里存的只是热点数据,全量数据是在MySQL中,此时如果把Redis中的key删除几个,一般来说,问题不大,但是如果把以是的的数据或者一大半的数据删除掉,影响掉会很大(Redis帮MySQL负重前行,效果没了很多多少,此时请求就会发送到MySQL中,此时MySQL可能会挂了,后果就会很严重)
如果把Redis当作数据库,此时误删数据的影响就会很大了
如果把Redis当作消息队列,具体问题具体分析
归根结底,不要乱删数据!!
expire
作用是给指定的key设置过期时间,key存活时间超出这个指定的值,就会被自动删除,
设置的时间单元为秒,很多业务场景具有时间限定,例如验证码,点外卖优惠券~~
基于Redis实现分布式锁,为了制止出现不能准确解锁的情况下,都会在加锁的时候设置一下过期时间,所谓的使用Redis作为分布式锁,就是给Redis里写一个key value
https://i-blog.csdnimg.cn/direct/59639cc58f994d7ca2db62186ed035b6.png
对于计算机来说,秒是很长的,以是有pexire 单元为毫秒
返回1是乐成的,返回0则说明设置失败(必须有相应的key)
https://i-blog.csdnimg.cn/direct/2dc38a50e37047e7be38b0256ad21d2f.png
此时hillo就会自动烧毁
https://i-blog.csdnimg.cn/direct/78adc013acf146bcb95328b40ab72027.png
ttl
(time to live)查询某key的剩余的烧毁时间
在ip协议报头中就有一个字段TTL,此处的ttl不实用时间来衡量的,使用次数来展示生命周期的
pttl是与ttl相对应的
https://i-blog.csdnimg.cn/direct/d286b53cca184bf79e2a626ab0fb258b.png
返回值为剩余过期时间,-1表示没有关联过期时间,-2表示key不存在
https://i-blog.csdnimg.cn/direct/7f26fde995de44b88ec08ebd7cdecab2.png
Redis中key过期策略是怎么实现的?
一个Redis中可能存在很多很多key,这些key中可能有很大一部分都有过期时间,此时Redis服务器怎样知道那些key已经过期要被删除,哪些key还没过期?
如果直接遍历所有的key效率很低
Redis整体的策略为:定期删除+惰性删除
1.惰性删除:假设key已经到过期时间了,但是暂时还没删他,key还存在,紧接着,后面有一次访问,恰好用到了这个key,于是这次访问就会让Redis服务器触发删除key的操作,同时在返回一个nil
2.定期删除:每隔一段时间,Redis服务器举行删除已经过期的key,但是如果遍历效率很低,以是Redis服务器每次只抽取一部分,举行验证过期时间,保证这个抽取检查的过程,充足快
Question:为什么堆定期删除的时间有明确时间?
Answer:因为Redis是单线程步伐,主要的任务(处理每个命令的任务,刚才扫描过期key),如果扫描过期key斲丧的时间太多了,就可能导致正常处理请求命令就会被阻塞了(产生了实行key *操作如许的效果)
虽然有两种策略结合,但是仍有很多残留过期的key,没有及时删除掉,以是Redis为了对上述举行补充,还提供了一系列的内存淘汰策略
1.Redis中并没有接纳定时器的方式来实现过期key删除的策略
2.如果有多个key过期,也可以通过一个定时器来高效/节流CPU的前提下来处理多个key(基于优先级队列,时间轮都可以实现比较高效的定时器)
Question:为啥Redis没有接纳这种定时器的方式呢?
Answer:很难考据为啥,基于定时器实现,就要引入多线程了,Redis早期版本就奠基了单线程的基调,引入多线程就突破了作者的初衷
定时器:在某个时间到达以后,实行指定的任务
1.基于优先级队列/堆的方式正常的队列是先进先出,但是优先级队列是按照指定的优先级举行收支
[*]在Redis中按照”过期时间越早,就是优先级越高“的优先级,将key参加到优先级队列中,过期时间越早的先出队列,队首元素就是最早要出的元素,此时定时器中只要分配一个线程去检查队首元素,看是否过期即可,此时扫描现场不必要遍历所有key,只必要盯住这一个线程即可
[*]在扫描线程检查队首元素的时候,也不能检查的太频繁,此时的做法就可以根据当前时候和队首元素的过期时间,设置一个等待,其时间差不多到了,系统在唤醒这个线程,此时也把cpu节流下来了
如果出现新任务更早,那么重新唤醒检查线程,详情请看该文章
2.基于时间轮实现的定时器
[*]把时间划分成很多小段,划分的粒度看实际需求,把小段分配到圆环上,假定一个小段100ms,每一个小段都挂个链表,每个链表都代表一个要实行的任务,相称于一个函数指针,以及对应的参数啥的,Java中也可以通过对象来实现雷同的效果
[*]假设必要添加一个key,这个key在300ms之后过期,那么我们在第三个格子中的链表添加该任务,此时指针就会相隔固定的时间(100ms),每次走到一个格子,就会把这个格子上链表的任务尝试实行一下
[*]假如说就10个格子,但是有个任务要30000ms后才气实行,那么30000/100=300,重新开始数第300个,数到尾就又来一圈,直到数到第300圈
[*]对于时间轮来说,每个格子是多少时间,一共多少格子,都是必要根据具体的实际场景,灵活调配的
[*]此处Redis并没有接纳这两种方案,可能是因为多线程的缘故
type
返回key对应value的数据类型
https://i-blog.csdnimg.cn/direct/9a8fa65bc00f45668630960b8a3dcc96.png
Redis作为消息队列的时候,使用这个类型的value,也就是上图中的stream
在Redis,操作方式差异很大,使用的命令都是完全不同的,以是在操作数据类型时举行type查询
时间复杂度是O(1)
https://i-blog.csdnimg.cn/direct/df212ef0009948219f0b23a6a27eddae.png
https://i-blog.csdnimg.cn/direct/fd9a47e6e8454bd1898cceaac5e230be.png
https://i-blog.csdnimg.cn/direct/748f5ff0d9d845a0980b431b5de76899.png
总结:
[*]基本的全局命令
[*]keys:用来查看匹配规则的key
[*]exists:用来判定指定key是否存在
[*]del:删除指定的key
[*]expire:给key设置过期时间
[*]ttl:查询key的过期时间
[*]type:查看key对应value的类型
[*]keys风险:使用keys *可能导致整个系统的崩溃
[*]del风险:删除一点影响很小,但是删除很多会导致MySQL乃至整个系统的崩溃
[*]redis key过期策略怎样实现:定时删除+惰性删除
[*]定时器的两种实现方式:时间轮+优先级队列
[*]围绕每个数据布局来介绍相关命令
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]