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

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...