Redis通用命令

通过Redis-cli客户端和Redis服务器交互

涉及到很多Redis的命令,掌握常用命令以及学会使用Redis文档

Redis中最核心的两个命令

get和set

Redis是按照键值对的方式进行存储

get 根据key来取value

set 把key和value存储进去

必须先进入redis-cli客户端,才能输入redis命令

set key value

key value都得是字符串,尽管是字符串,但并不需要双引号,如果加上引号也是可以的,‘“均可以

redis命令不区分大小写

get命令同样get key1获得value1

如果当前get key,key不存在,那么会返回nil

Redis全局命令-keys命令

Redis支持许多数据结构,整体上来说是键值对结构,key固定就是字符串,value实际上会有很多类型,例如字符串,哈希表,列表,集合,有序集合

操作不同的数据结构就会有不同的命令,所谓全局命令就是能够搭配任意数据结构

keys

keys-用来查询当前服务器上匹配的key

通过一些特殊符号(通配符)来描述key的模样,匹配上述模样的key就能查询出来

pattern描述了字符串符合的要求,来筛选了字符串

pattern具体怎么写?支持怎样的通配符,

匹配规则

? 匹配任意一个字符

* 匹配0个或者任意一个字符

[ae] 只能匹配a e,别的不行,相当于给出了具体的选项

[^e] 代表排除e,只有e排除不了,其他的都能匹配

[a-b] 只能是a至b这个范围内的字符,同时包括两侧边界

上述匹配规则,不用刻意背,实践才能牢记

注意事项:

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是否存在

返回值是key存在的个数,Redis不是键值对结构嘛?为什么有多个key?这里的Redis非常特殊

时间复杂度为O(N) N代表着key对应的个数有N个 按照这些key按照哈希表的方式进行组织,所以和哈希表的查询复杂度一样,Redis支持很多数据结构,指的是一个Value可以是很多复杂的数据结构,Redis具体的某个值,又可以是一些数据结构

分两次查询和分一次查询有什么区别吗?切记,网络通讯效率低,开销大,所以一次请求响应比两次请求响应更加迅速,

封装和分用,进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层,到物理层,层层封装(每一次协议都要加上报头或者尾),接收方收到一个数据,这个数据就要从物理层到应用层层层分层,网卡是IO设备,消耗很大的开销,更何况,客户端和服务器不一定在同一个主机上,所以Redis的很多命令都支持一次操作多个key的/支持多种操作

del

删除指定的key,可以一次删除多个key

时间复杂度为O(k),k为删除掉key的个数

返回值:删除掉key的个数

在Redis中删除数据很严重吗?Redis主要的应用场景就是作为缓存,此时Redis里存的只是热点数据,全量数据是在MySQL中,此时如果把Redis中的key删除几个,一般来说,问题不大,但是如果把所以的的数据或者一大半的数据删除掉,影响掉会很大(Redis帮MySQL负重前行,结果没了好多,此时请求就会发送到MySQL中,此时MySQL可能会挂了,后果就会很严重)

如果把Redis当作数据库,此时误删数据的影响就会很大了

如果把Redis当作消息队列,具体问题具体分析

归根结底,不要乱删数据!!

expire

作用是给指定的key设置过期时间,key存活时间超出这个指定的值,就会被自动删除,

设置的时间单位为秒,很多业务场景具有时间限制,例如验证码,点外卖优惠券~~

基于Redis实现分布式锁,为了避免出现不能正确解锁的情况下,都会在加锁的时候设置一下过期时间,所谓的使用Redis作为分布式锁,就是给Redis里写一个key value

对于计算机来说,秒是很长的,所以有pexire 单位为毫秒

返回1是成功的,返回0则说明设置失败(必须有相应的key)

此时hillo就会自动销毁

ttl

(time to live)查询某key的剩余的销毁时间

在ip协议报头中就有一个字段TTL,此处的ttl不适用时间来衡量的,使用次数来展示生命周期的

pttl是与ttl相对应的

返回值为剩余过期时间,-1表示没有关联过期时间,-2表示key不存在

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的数据类型

Redis作为消息队列的时候,使用这个类型的value,也就是上图中的stream

在Redis,操作方式差别很大,使用的命令都是完全不同的,所以在操作数据类型时进行type查询

时间复杂度是O(1)

总结:

  • 基本的全局命令
  • keys:用来查看匹配规则的key
  • exists:用来判定指定key是否存在
  • del:删除指定的key
  • expire:给key设置过期时间
  • ttl:查询key的过期时间
  • type:查看key对应value的类型
  • keys风险:使用keys *可能导致整个系统的崩溃
  • del风险:删除一点影响很小,但是删除很多会导致MySQL乃至整个系统的崩溃
  • redis key过期策略如何实现:定时删除+惰性删除
  • 定时器的两种实现方式:时间轮+优先级队列
  • 围绕每个数据结构来介绍相关命令
  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值