Redis的一些通用指令

embedded/2024/11/15 3:50:29/

   首先我们需要先连接客户端服务器,此时我们需要通过redis-cli和redis服务器进行交互,输入ping来确保通路的流畅

   (一)get和set

   redis中最核心的两个命令就是get和set,get就是根据key来取出对应value,set就是把key和value给存储进去(redis是根据键值对的方式存储数据的)

如果通过get想要获取的value不存在,就会返回一个nil(跟java中的null类似)

(二)redis全局命令

   redis是支持很多数据结构的(value中的数据可以用不同数据结构存储,key是固定的字符串类型),但是不同的数据结构有不同的命令,我们接下来要说的是所有数据结构类型都通用的一些命令。

1.keys

用来查询当前服务器上匹配的key:通过一些通配符来描述key的模样,匹配上述模样的key

?:匹配任意一个字符

*:匹配任意多个字符

[ae]:只匹配ae字符

[a-e]:匹配a到e的字符

[^e]:匹配除了e的字符

  keys的复杂度是O(N)因为需要遍历所有key,所以我们在生产环境上一般不使用keys,尤其还有一个keys*,遍历所有key

   那为什么我们生产环境一般不适用keys?是因为redis是单线程服务器如果keys*的时间很长,redis就会被阻塞,无法给其他客户端提供服务。

   而且redis经常用于缓存来减少服务器的压力,如果redis阻塞,那么服务器的请求量会一瞬间增大,容易把服务器弄挂

2.exists

来判断key是否还存在

返回值是key存在的个数,我们可以同时传输多个key

时间复杂度是O(1)因为redis组织key是按照哈希表的方式来组织的

那上述代码我们可以一次访问多个,也可以一次访问一个,那两者有什么区别?

  本质上没有区别,但是我们要知道redis是一个客户端服务器结构的程序,要通过网络来进行通信,但是分开写需要进行多次网络通信,这样就会导致我们的效率降低(所以redis很多命令都可以一次操作多个key或者多种操作)

3.del

删除指定的key

也可以一次删除多个或者一个,返回值是删掉的个数

时间复杂度O(1)

  我们之前在mysql数据库中删除操作是drop当时我们说删除操作是很危险的,因为一旦删除了就找不回来了,redis同理,也十分危险,但是比mysql还是好了很多(不同场景)

 比如我们redis缓存,我们放的是热点数据,所有数据都在数据库服务器中有备份,此时删除一两个问题不大(删多了会造成服务器请求量过大),但是如果redis做服务器那么删除数据就也很危险,如果把redis做消息队列,就看我们的是什么数据了,是否重要

4.expire和pexprie

作用是给指定的key设置过期时间,当key存活时间超出这个指定值就会被自动删除(可应用在验证码,分布式锁等等)

expire单位是s,pexpire是ms

我们要设置过期时间是要针对已经有的key设置,设置成功就返回1,失败就返回0,时间复杂度也是O(1)

那此时我们怎么知道是不是10s钟删除了呢?这时我们需要另一条指令

5.ttl和pttl

用来查看当前的key的过期时间还有多少

ttl的单位是s,pttl的单位是ms

如果执行完会返回-2

扩:redis的key过期策略是如何实现?

   我们刚才说expire可以给key设置过期时间,到时间就要进行删除,那么一个redis中有很多key,这些大部分有过期时间,我们redis怎么知道那些key要被删除?如果通过遍历,就会导致效率过低,很可能会影响我们的服务器

   所以redis是通过

1.定期删除:

   我们redis会定期的抽取一部分数据(一般不会很大)来验证过期时间,如果到了会进行删掉,之所以抽取一部分数据,也是为了保证定期删除这个操作的速度。

2.惰性删除:

  我们如果时间到了也不删除他,key还存在,如果我们之后访问到了,用到了这个key,就会让redis触发删除操作,删除这个key同时返回nil

但是光凭上述两个删除策略,会导致在内存中仍然有需要删除的数据存在,本来redis就是在内存中存储,空间不大,所以我们引入了内存淘汰策略

3.内存淘汰策略:

  这个我们之后会说

   在我个人看来,redis是可以通过一个定时器来进行定时删除的,他可以让内存尽快的被释放,但同时引入的问题就是会占用更多cpu资源,而占用更多cpu资源就需要引入多线程,我们redis没有引入定时器,在我个人看来就是因为redis是单线程的,虽然之后改成了支持多线程,但那也是之后的事情

   那来说一下我个人会怎么实现这个定时删除

   首先我们要引入一个定时器,可以基于优先级队列也可以通过时间轮,如果通过优先级队列,我们可以把过期时间早的,设置成高优先级,过期时间早的就可以先出队列,这时队首元素就是最早要过期的key,我们就不要遍历所有key来判断过期时间,只需要判断队首key的过期时间即可,但是虽然这个要在多线程情况下执行,需要分配一个线程,但是一直判断队首key时间也会导致cpu占用率过高,这时我们需要设置一个等待时间,等时间到了再去唤醒这个线程 

   如果在等待时来了一个新的线程,就需要先唤醒下刚才的线程,重新检查队首元素,重新设置阻塞时间。

  通过时间轮就是把时间划成几个小段每个小段代表不同的时间,类似于哈希表的结构(但是跟名字一样,是一个圈),每个小段里是一个链表,每个链表代表一个要执行的任务,我们每次添加一个key如果有过期时间就会放入对应的小段链表中,每次走到这个各自,就会尝试一下这个链表上的任务

  我认为,上述通过优先级队列和时间轮实现定时器的方法可以很好的解决问题

6.type

     返回key对应value的数据类型

     

时间复杂度O(1)


http://www.ppmy.cn/embedded/115266.html

相关文章

设计模式之组合模式例题

答案:C A 知识点:组合模式的意图:将对象组合成树型结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

react native(expo)多语言适配

项目基于 expo框架 开发。请先配置好 expo 开发环境 1.引入i18n-js npx expo install i18n-js 2.新建languages文件夹,其中包括英文、中文等语种目录。结构如下: *.json文件为语种翻译后的json键值对,用于UI中引用; { "appName&q…

Parallels Desktop 20(Mac虚拟机) v20.0.0 for Mac 最新破解版(支持M系列)

Parallels Desktop 20 for Mac 正式发布,完全支持 macOS Sequoia 和 Windows 11 24H2,并且在企业版中引入了全新的管理门户。 据介绍,新版本针对 Windows、macOS 和 Linux 虚拟机进行了大量更新,最大的亮点是全新推出的 Parallels…

Cubieboard2(三) 系统构建 —— WSL Ubuntu 中挂载 U 盘(SDCard)

文章目录 1 WSL Ubuntu 中挂载 U 盘(SDCard)2 usbipd 搭建虚拟机与宿主机 USB 通信桥梁3 WSL 内核添加 USB 设备驱动3.1 编译 WSL Linux 内核3.2 挂载 USB(SDCard) 设备 附录:WSL 操作命令附录:git 仓库检出 1 WSL Ubuntu 中挂载 U 盘(SDCard) Linux 驱动…

聚焦于 Web 性能指标 TTI

在优化网站性能的过程中,我们经常遇到一个“为指标而优化”的困境。指标并不能真正反映用户体验,而应该最真实地反映用户行为。 在本节中,我们将研究 TTI(Time to Interactive)。在深入探讨这个话题之前,我…

KG Structure as Prompt:利用知识图谱构建Prompt,提高大模型对因果关系的理解

KG Structure as Prompt:利用知识图谱构建Prompt,提高大模型对因果关系的理解 秒懂大纲提出背景解法拆解创意视角中文意译 论文:Knowledge Graph Structure as Prompt: Improving Small Language Models Capabilities for Knowledge-based Ca…

如何写数学建模竞赛论文

撰写数学建模论文的重要性不言而喻,它直接决定了成绩的好坏和获奖级别的高低。论文是竞赛成果的书面体现,同时也是科技写作的基础训练。评审论文的标准包括假设的合理性、建模的创新性、结果的合理性以及表述的清晰性。 一、论文的基本内容和需要注意的…

Pycharm Debug Django项目时报错

在对Django项目进行Debug时出现启动失败的问题,经过多方查询未果,在解决问题后前来记录,以此帮助后来者。觉得有帮助的记得点赞噢!!! 错误内容如下 Unknown command: D:\\PyCharm 2023.2.6\\plugins\\pyt…