当前位置: 首页 > news >正文

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普通分块查找 分块原则: 块内无序,块间有序:前一块中的最大数据,小于后一块中所有的数据,块与块之间不能有数据重复的交集。块的数量一般等于数字个数开根号 核心思路&#xff…...

进制数知识(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算法&#xff0c…...

我能禁止使用某协议的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 在团队工作中能产生哪些实质性影响。 在软件工程中,一个引人注目的应用场景是…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...