Redis的一些通用指令
首先我们需要先连接客户端服务器,此时我们需要通过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)
相关文章:
Redis的一些通用指令
首先我们需要先连接客户端服务器,此时我们需要通过redis-cli和redis服务器进行交互,输入ping来确保通路的流畅 (一)get和set redis中最核心的两个命令就是get和set,get就是根据key来取出对应value,set就是把…...
C++中vector类的使用
目录 1.vector类常用接口说明 1.1默认成员函数 1.1.1构造函数(constructor) 1.1.2 赋值运算符重载(operator()) 2. vector对象的访问及遍历操作(Iterators and Element access) 3.vector类对象的容量操作(Capacity) 4. vector类对象的修改及相关操作(Modifiers and Stri…...
cmaklist流程控制——调试及发布
cmaklist流程控制 目前只会配置-编译调试-打包发布,并且不会workflow控制 后续学习配置-编译调试-测试-打包发布,workflow控制,理解整个流程,目前对流程控制理解也不够。 1.CMake Presets 先于Cmakelist文件,指导项…...
制作一个能对话能跳舞的otto机器人
OTTO机器人是一个开源外壳,硬件和软件的桌面机器人项目,非常适合新手研究和拓展。记住,他是一个能移动有表情能声音的机器人。 b站有很多演示和组装的视频,我就不多说了,照着做就好,因为硬件我也是刚入门&…...
git配置SSH
1 打开cmd窗口 2 在窗口中输入如下命令: 配置用户名: git config --global user.name “gyk” 配置邮箱: git config --global user.email “247929163qq.com” 继续在Git命令窗口中输入如下命令,即可生成SSH公钥和私钥 ss…...
mozilla/pdf.js view.html加载指定页码
mozilla/pdf.js view.html加载指定页码 在Mozilla’s PDF.js中,如果你想要在viewer.html加载时直接跳转到指定的页码,你可以通过修改URL来实现。 PDF.js使用查询参数来处理URL,其中page参数用于指定页码。你可以通过修改URL的查询字符串来设…...
Qt之QFuture理解
结构 #mermaid-svg-J9J683RG8QjtEqoM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-J9J683RG8QjtEqoM .error-icon{fill:#552222;}#mermaid-svg-J9J683RG8QjtEqoM .error-text{fill:#552222;stroke:#552222;}#merm…...
求二叉树的高度(递归和非递归)
假设二叉树采用二叉链表存储结构,设计一个算法求二叉树的高度。 递归: int getTreeHight(BiTree T){if(TNULL){return 0;}else {int lh getTreeHight(T->lchild);int rh getTreeHight(T->rchild);return (lh>rh?lh:rh)1;}}时间复杂度O(n)&a…...
Java查找算法——(四)分块查找(完整详解,附有代码+案例)
文章目录 分块查找1.1普通分块查找 分块查找 1.1普通分块查找 分块原则: 块内无序,块间有序:前一块中的最大数据,小于后一块中所有的数据,块与块之间不能有数据重复的交集。块的数量一般等于数字个数开根号 核心思路ÿ…...
进制数知识(2)—— 浮点数在内存中的存储 和 易混淆的二进制知识总结
目录 1. 浮点数在内存中的存储 1.1 浮点数的大V表示法 1.2 浮点数的存储格式 1.3 浮点数的存入规则 1.4 浮点数的读取规则 1.5 补充:移码与掩码 1.6 题目解析 2. 易错的二进制知识 2.0 符号位到底会不会参与运算? 2.0.1 存储前的编码变化运算 …...
类似QQ聊天功能的Java程序
实现一个类似QQ聊天功能的Java程序需要考虑以下几个关键点: 用户界面:用于展示消息和输入消息。网络通信:用于客户端之间的信息传输。用户管理:用于管理用户的登录、注册和状态。消息存储:用于存储聊天记录。 这里提…...
Redis 键值对数据库学习
目录 一、介绍 二、安装以及连接 三、设置连接密码 四、连接报错 五、redis 操作字符串以及过期时间 六、 redis 列表操作 七、redis 集合操作 八、hash 哈希操作 九、redis 发布和订阅操作 十、RDB和AOF的两种数据持久化机制 十一、 其他机器连接redis 十二、 pyt…...
逆向推理+ChatGPT,让论文更具说服力
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 使用ChatGPT辅助“逆向推理”技巧,可以显著提升论文的质量和说服力。逆向推理从结论出发,倒推所需的证据和论点,确保整个论证过程逻辑严密且无漏洞。…...
「JavaScript深入」一文说明白JS的执行上下文与作用域
JavaScript深入 — 执行上下文与作用域 上下文执行上下文生命周期创建阶段执行阶段回收阶段 执行栈作用域链作用域词法作用域(静态作用域) 上下文 变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。 每个上下文都有一个关联的…...
Qt C++设计模式->组合模式
组合模式(Composite Pattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。 组合模式的应用场景 组合…...
Acwing Bellman-Ford SPFA
1. Bellman-Ford 该算法适用于有负权边的情况,注意:如果有负权环的话,最短路就不一定存在了。时间复杂度 O ( m n ) . O(mn). O(mn).该算法可以求出来图中是否存在负权回路,但求解负权回路,通常用SPFA算法,…...
我能禁止使用某协议的ip禁止访问我的资源吗
是的,你可以禁止使用某个协议的IP地址访问你的资源。这种操作通常涉及网络防火墙、服务器配置或应用程序设置,具体方法取决于你的网络环境和使用的技术。以下是一些常见的实现方法: 1. 使用防火墙 大多数防火墙(硬件或软件&…...
快速理解TCP协议(二)——TCP协议中的拥塞控制机制详解
在计算机网络中,TCP(传输控制协议)是一种广泛使用的面向连接的、可靠的、基于字节流的传输层通信协议。TCP协议通过一系列复杂的机制来确保数据的可靠传输,其中拥塞控制是至关重要的一环。本文将深入探讨TCP协议中的拥塞控制机制&…...
Linux:debug: systemtap: ubacktrace
https://docs.huihoo.com/systemtap/sourceware.org/systemtap/SystemTap_Beginners_Guide/ustack.html 这个函数可以帮助将user level的backtrace打印出来。 stap -d /bin/ls --ldd \ -e probe process("ls").function("xmalloc") {print_usyms(ubacktra…...
使用AI进行需求分析的案例研究
生成式 AI 的潜在应用场景似乎无穷无尽。虽然这令人兴奋,但也可能让人不知所措。因此,团队在使用这项技术时需要有明确的目标:关键是要明确生成式 AI 在团队工作中能产生哪些实质性影响。 在软件工程中,一个引人注目的应用场景是…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
