Redis的通用命令
⭐️前言⭐️
本文主要介绍Redis的通用命令
🍉欢迎点赞 👍 收藏 ⭐留言评论
🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
🍉博客中涉及源码及博主日常练习代码均已上传GitHub
📍内容导读📍
- 🍅通用命令
- 🍅1.启动和停止服务器
- 🍅2.get和set
- 🍅3.全局命令
- keys
- exists
- del
- expire
- ttl
- type
- 小结
- 🍅4.key的过期策略【经典面试题】
- 🍅5.定时器的实现原理
🍅通用命令
🍅1.启动和停止服务器
启动redis服务器
redis-server /etc/redis/redis.conf
停止redis服务器
先通过netstat或者ps查询redis服务器的pid
netstat -anp | grep redis
ps aux | grep redis
再根据pid进行kill即可
kill 进程id
连接Redis服务器
在输入Redis命令之前,需要先连接上Redis服务器
redis-cli
断开连接
ctrl+D
🍅2.get和set
Redis是按照键值对的方式来存储数据的,通过get和set这两个核心的命令来存储键值对和取值
set key value //key和value都是字符串
Redis中的命令不区分大小写,而且对于上述这里的key和value,不需要加上引号,就是表示字符串的类型。
get key //根据key获取value
get命令直接输入key就能得到value,如果当前key不存在,会返回nil(nil和null/NULL是一个意思)
示例:
🍅3.全局命令
Redis支持很多种数据结构,整体上来说,Redis是键值对结构,key固定就是字符串,value实际上会有很多种类型(包括字符串、哈希表、列表、集合、有序集合等),操作不同的数据结构,就会有不同的命令;
全局命令,就是能够搭配任意一个数据结构来使用的命令。
keys
通过一些特殊符号(通配符)来描述key的模样,匹配上述模样的key就能被查询出来
语法:
keys pattern
返回所有满足样式(pattern)的key,支持如下统配样式。
h?llo
匹配hello、hallo等
,?
匹配任意一个字符h*llo
匹配hllo、heeeello等
,?
匹配任意个任意字符h[abe]llo
匹配hallo、hbllo、hello等
,[abe]
只能匹配到a、b、e
,相当于给了固定选项h[^e]llo
匹配除hello
以外的,[^e]
排除e
,只有e
匹配不了,其他的都能匹配h[a-c]llo
匹配hallo、hbllo、hcllo
,[a-c]
匹配a-c
这个范围内的字符,包含两侧边界
示例:
注意事项:
keys
命令的时间复杂度是O(N),所以在生产环境上,一般都会禁止使用keys
命令,尤其是keys *(该命令会查询redis中的所有key)
生产环境上的key可能会非常多,而Redis是一个单线程的服务器,执行
keys *
的时间非常长,就会使redis服务器被阻塞了,无法给其他客户端提供服务。Redis经常会用于做缓存,挡在MySQL前面,万一redis被一个
keys *
阻塞住了,此时其他的查询redis操作就超时了,此时这些请求就会直接查数据库。如果一大波请求直接过来,就会导致MySQL措手不及,很容易就挂了,这样整个系统基本就瘫痪了。
exists
判断key是否存在
语法:
exists key [此处key可以是一个或者多个,用空格隔开]
时间复杂度:O(1)
返回值:key存在的个数
示例:
exists key1 key2
和分开写exists key1;exists key2
有什么区别呢?
redis是一个客户端-服务器结构的程序,客户端和服务器之间通过网络来进行通信,如果分开的话,会产生更多轮次的网络通信,效率更低。
提到网络通信,就得提一下封装和分用
封装:进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层到物理层层层封装,每一层协议都要加上报头或者尾,类似于我们发一个快递,需要包装一下,要包装好几层
**分用:**接收方收到一个数据,这个数据就要从物理层到应用层层层分用,把每一层协议中的报头或者尾给拆掉,类似于我们收到快递,要拆快递,拆很多层
del
删除指定的key
语法:
del key [此处key可以是一个或者多个]
时间复杂度:O(1)
返回值:删除掉的key的个数
示例:
在MySQL中,删除类的操作比如drop database、drop table、delete from...
都是非常危险的操作,一旦删除了之后,数据就没了;
而redis主要的应用场景,就是作为缓存,此时redis里存的只是热点数据,全量数据是在MySQL数据库中,此时如果把redis中的key删除了几个,一般来说,问题都不大;
但是当然如果把所有的数据或者一大半数据都删除了,这种影响会很大;本来redis是帮MySQL负重前行的,redis没数据了,大部分的请求就直接打给MySQL了,然后很容易把MySQL搞挂
相比之下,如果是MySQL这样的数据,哪怕误删了一个数据,都可能是影响很大的
如果是把redis作为数据库,此时误删数据的影响就很大了;
如果是把redis作为消息队列(mq),这种情况误删数据影响大不大,就需要具体问题具体分析了
expire
为指定的key添加秒级的过期时间(Time To Live ;TTL)
这里的key必须是针对已经存在的key设置
key存活时间超出这个指定的值,就会被自动删除
语法:
expire key seconds
pexpire key 毫秒
时间复杂度:O(1)
返回值:1表示设置成功,0表示设置失败
示例见ttl
处
过期时间这个实现,有很多的业务场景:
1、在进行登录时,经常会用到手机验证码,该验证码5分钟内有效;
2、点外卖,有优惠券在指定时间内有效;
3、基于redis实现分布式锁,为了避免出现不能正确解锁的情况,通常都会在加锁的时候设置一下过期时间(所谓的使用redis作为分布式锁,就是给redis里写一个特殊的key value)
ttl
获取指定key的过期时间,秒级 Time To Live TTL
语法:
ttl key
pttl key
毫秒级
时间复杂度:O(1)
返回值:查询当前key的剩余过期时间,-1表示没有关联过期时间,-2表示key不存在(时间到被自动删除了)
示例:
type
返回key对应value的数据类型
语法:
type key
时间复杂度:O(1)
返回值:none
,string
,list
,set
,zset
,hash
and stream
.
示例:
小结
当前已经学习了redis中几个基本的全局命令:
keys:用来查看匹配规则的key
exists:用来判定指定key是否存在
del:删除指定的key
expire:给key设置过期时间
ttl:查询key的过期时间
type:查询key对应的value类型
🍅4.key的过期策略【经典面试题】
一个redis中可能同时存在很多很多的key,这些key中可能有很大一部分都有过期时间,此时redis服务器咋知道哪些key已经过期要被删除,哪些key还没过期呢?如果直接遍历所有的key,效率很低显然是行不通的。
Redis整体的策略是定期删除和惰性删除相结合:
定期删除:
每次抽取一部分,进行验证过期时间,需要保证这个抽取检查的过程足够快。
为什么这里对于定期删除的时间有明确的要求呢,这是因为redis是单线程的程序,主要的任务是处理每个命令,还有包括扫描过期的key等,如果扫描过期的key消耗的时间太多了,就可能导致正常处理请求的命令就被阻塞了(产生了类似于执行
keys *
这样的效果)
惰性删除:
假设key已经到过期时间了,但是暂时还没删它,key还存在,紧接着后面又一次访问,正好用到了这个key,这次访问就会让redis服务器触发删除key的操作,同时再返回一个nil
这个过程就类似于我们去超市买一瓶饮料的场景,我拿到了饮料,在正要付钱的时候看了一眼生产日期,发现过期了,于是老板就没卖这瓶饮料;因为超市里面商品很多,老板也不知道哪些商品已经过期了,而在客户付款的时候发现商品过期了,老板再进行物品删除,这个场景和惰性删除类似。
虽然有了上述两种策略结合,但是整体的效果一般,仍然可能会有很多过期的key被残留了,没有被及时删除掉,redis为了对上述进行补充,还提供了一系列的内存淘汰策略。
🍅5.定时器的实现原理
定时器就类似于一个闹钟,在某个时间到达之后,会执行指定的任务;
定时器的实现方式有以下两种(redis不是基于以下两种,但和第二种的实现有相像之处):
1、基于优先级队列/堆
正常的队列是先进先出,而优先级队列则是按照指定的优先级先出
这里的优先级是可以自定义的,在redis过期key的场景中,就可以通过“过期时间越早,优先级越高”来进行优先级定义。
现在假定有很多key设置了过期时间,就可以把这些key加入到一个优先级队列中,指定优先级规则是过期时间早的先出队列,那么队首元素就是最早的要过期的key。
定时器中只要分配一个线程,让这个线程去检查队首元素,看是否过期即可,如果队首元素还没过期,后续元素一定没过期。(此时扫描线程不需要遍历所有key,就只盯住这一个队首元素即可)
另外在扫描线程检查队首元素过期时间的时候,也不能检查的太频繁,此时的做法就是可以根据当前时刻和队首元素的过期时间,设置一个等待,当时间差不多到了,系统再唤醒这个线程。(此时扫描线程也不需要高频扫描队首元素,把CPU的开销也节省下来了)
万一线程在休眠的时候,来了一个新的任务,这时候需要唤醒一下刚才的线程,重新检查一下队首元素,再根据时间差距重新调整阻塞时间即可。
2、基于时间轮实现的定时器
这种方式是把时间划分成很多小段(划分的粒度要看实际需求),每个小段上都挂着一个链表,链表的每个节点都代表一个要执行的任务。
假设需要添加一个key,这个key在300ms之后过期,就会放在第三个小段中;
此时这个指针,就会每隔固定的时间间隔(此处约定是100ms)走到下一个格子,每次走到一个格子,就会把这个格子上链表的任务尝试执行一下。
对于时间轮来说,每个格子是多少时间,一共多少个格子,都是需要根据实际场景,灵活调配的。
此处需要注意,Redis并没有采取上述的方案,但是要了解这两种方案,都是属于高效的定时器的实现方式,很多场景可能都会用到;
在Redis源码中,有一个比较核心的机制,叫做事件循环,其实现就和时间轮的实现比较相似
⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁
相关文章:

Redis的通用命令
⭐️前言⭐️ 本文主要介绍Redis的通用命令 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主日常练习代码均已上传GitHub 📍内容导…...
设计模式六大原则和单例模式
设计模式 目的 实现可重用解决方案,构筑易维护、可扩展的软件系统。 六大原则 单一职责: 类的职责单一,一个方法做一件事。 开闭原则: 拓展开放,修改关闭。 里氏替换: 父类能出现的地方,子…...
Redis性能优化
1.是否使用复杂度过高的命令 首先,第一步,你需要去查看一下 Redis 的慢日志(slowlog)。 Redis 提供了慢日志命令的统计功能,它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前,你需要设置慢…...

SAM 大模型杂谈
目录 1. 前言 2. 发展历程 3. SAM 大模型的技术架构 3.1 模型结构 3.2 训练方法 3.3 数据处理 4. SAM 大模型的应用领域 4.1 自然语言处理 4.2 计算机视觉 4.3 多模态学习 4.4 其他领域 5. SAM 大模型的优势与挑战 5.1 优势 5.2 挑战 6. SAM 大模型的未来发展方…...

openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用
openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见:openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…...

B站自研的第二代视频连麦系统(上)
导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面,介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解,帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中ÿ…...

【远程控制】安装虚拟显示器
todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是:支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…...

基于HAI部署DeepSeekR1的招标文书智能辅助生产开发与应用
一、前言 1.1行业背景 在日常商业活动中,招投标流程往往是企业竞标和项目落地的关键一环。其中,招标文书的编写工作对于投标企业极具挑战:既要保证逻辑清晰、条理分明,又必须遵循招标机构的各类格式规范,甚至还有特定…...

解决whisper 本地运行时GPU 利用率不高的问题
我在windows 环境下本地运行whisper 模型,使用的是nivdia RTX4070 显卡,结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…...
模拟实战-用CompletableFuture优化远程RPC调用
实战场景 这是广州某500-900人互联网厂的面试原题 手写并发优化解决思路 我们要调用对方的RPC接口,我们的RPC接口每调用一次对方都会阻塞50ms 但是我们的业务要批量调用RPC,例如我们要批量调用1k次,我们不可能在for循环里面写1k次远程调用…...
深入解析:Jsoup 库的多功能应用场景
Jsoup 是一个强大的 Java 库,主要用于解析和操作 HTML 文档。它不仅广泛应用于网络爬虫和数据抓取,还在网页内容分析、数据清洗与处理、自动化测试等多个领域有着广泛的应用。本文将详细介绍 Jsoup 库的多种用途,并提供具体的代码示例。 一、…...

Polardb三节点集群部署安装--附虚拟机
1. 架构 PolarDB-X 采用 Shared-nothing 与存储计算分离架构进行设计,系统由4个核心组件组成。 计算节点(CN, Compute Node) 计算节点是系统的入口,采用无状态设计,包括 SQL 解析器、优化器、执行器等模块。负责数据…...

Redis - 全局ID生成器 RedisIdWorker
文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中,生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...
【Vitest】单元测试
文章目录 测试:Vitest一、安装二、断言三、回调测试四、对象方法五、模拟第三库 测试:Vitest 一、安装 npm install vitest创建文件:example.test.ts 运行测试: npx vitest example二、断言 import { expect, test } from vi…...

达梦数据库从单主模式转换为主备模式
目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明基于脱机备份方式的单实例转主备流程图详细步骤说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建…...

【Elasticsearch】nested聚合
在 Elasticsearch 中,嵌套聚合(nestedaggregation)的语法形式用于对嵌套字段(nestedfields)进行聚合操作。嵌套字段是 Elasticsearch 中的一种特殊字段类型,用于存储数组中的对象,这些对象需要独…...

虹科波形小课堂 | 三分钟掌握车辆相对压缩测试!不拆发动机、不测缸压就能判断故障缸!
不拆发动机、不测缸压,只测个电流也能知道哪个缸压缩有问题?没错!做个相对压缩测试,测下起动电流就行,简单又实用!今天,从原理到方法,几分钟教会你! 我们都知道…...

【玩转全栈】--创建一个自己的vue项目
目录 vue介绍 创建vue项目 vue页面介绍 element-plus组件库 启动项目 vue介绍 Vue.js 是一款轻量级、易于上手的前端 JavaScript 框架,旨在简化用户界面的开发。它采用了响应式数据绑定和组件化的设计理念,使得开发者可以通过声明式的方式轻松管理数据和…...

基于 Spring Cloud + Spring AI + VUE 的知识助理平台介绍以及问题
前言(一些废话) 在看这篇文章的各位大佬,感谢你们留出几分钟时间,来看这个产品介绍,其实重点说实话,不是这个产品怎么样。而是在最后有一个郁结在心里的几个问题,希望大佬们能给出一些建议。万…...

< 自用文儿 > 下载 MaxMind GeoIP Databases 对攻击的 IP 做 地理分析
起因 两个 VPM/VPS,安装了 fail2ban 去拦截密码穷举攻击。每天的记录都在增长,以前复制屏幕输出就行,一屏的内容还容易粘贴出来的。昨天已经过 500 条,好奇 fail2ban 是如何存储这些内容的?就发现它在使用 SQLite3 数…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...