【redis】基础指令|数据结构总览|单线程架构分析

W...Y的主页 😊

代码仓库分享💕 

 


前言:redis系类博客都是以redis5.0版本为基础!!!

目录

Redis常见命令

基本全局命令 

KEYS

EXISTS 

DEL

EXPIRE

TTL

TYPE

数据结构和内部编码

单线程架构


Redis常见命令

在正式介绍5种数据结构之前,了解⼀下Redis的⼀些全局命令、数据结构和内部编码、单线程 命令处理机制是⼗分必要的,它们能为后⾯内容的学习打下⼀个良好的基础. 主要体现在两个⽅⾯: 1)Redis的命令有上百个,如果纯靠死记硬背⽐较困难,但是如果理解Redis的⼀些机制,会发现这 些命令有很强的通⽤性。
2)Redis不是万⾦油,有些数据结构和命令必须在特定场景下使⽤,⼀旦使⽤不当可能对Redis本⾝ 或者应⽤本⾝造成致命伤害。

基本全局命令 

Redis 有5种数据结构,但它们都是键值对种的值,对于键来说有⼀些通⽤的命令。

KEYS


返回所有满⾜样式(pattern)的key。⽀持如下统配样式。
• h?llo 匹配 hello ,hallo,hqllo……
• h*llo 匹配 hllo 和 heeeello……
• h[ ae]llo 匹配 hello 和 hallo
• h[ ^e]llo 匹配 hallo, hbllo……但不匹配 hello
• h [a-b]llo 匹配 hallo 和 hbllo

语法:KEYS pattern
命令有效版本:1.0.0之后 时间复杂度:O(N) 返回值:匹配pattern的所有key。

示例:

redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "firstname"
2) "lastname"
redis> KEYS a??
1) "age"

redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"

EXISTS 

判断某个 key 是否存在。
语法: EXISTS key [key ...]

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:key 存在的个数。

示例:

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2

DEL


删除指定的 key。
语法:DEL key [key ...]
命令有效版本:1.0.0 之后
时间复杂度:O(1) 
返回值:删除掉的 key 的个数。

示例:

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> DEL key1 key2 key3
(integer) 2

EXPIRE


为指定的 key 添加秒级的过期时间(Time To Live TTL)
语法:EXPIRE key seconds

命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:1 表⽰设置成功。0 表⽰设置失败。

示例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10 

TTL


获取指定 key 的过期时间,秒级。
语法:TTL key
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:剩余过期时间。-1 表⽰没有关联过期时间,-2 表⽰ key 不存在。

示例:

redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10 

EXPIRE和TTL命令都有对应的⽀持毫秒为单位的版本:PEXPIRE和PTTL,详细⽤法就不再
介绍了。 

TYPE


返回key对应的数据类型。
语法:TYPE key 
命令有效版本:1.0.0之后
时间复杂度:O(1)
返回值: none , string , list , set , zset , hash and stream .。

示例:
redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

数据结构和内部编码

type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列
表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是 Redis 对外的数据结构。

可以看到每种数据结构都有⾄少两种以上的内部编码实现,例如 list 数据结构包含了 linkedlist 和
ziplist 两种内部编码。同时有些内部编码,例如 ziplist,可以作为多种数据结构的内部实现,可以通过 object encoding 命令查询内部编码:

27.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist" 

可以看到 hello 对应值的内部编码是 embstr,键 mylist 对应值的内部编码是 ziplist。
Redis 这样设计有两个好处:
1)可以改进内部编码,⽽对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码,⽆需改动外部数据结构和命令,例如 Redis 3.2 提供了 quicklist,结合了 ziplist 和 linkedlist 两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,⽽对⽤⼾来说基本⽆感知。
2)多种内部编码实现可以在不同场景下发挥各⾃的优势,例如 ziplist ⽐较节省内存,但是在列表元素⽐较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为
linkedlist,整个过程⽤⼾同样⽆感知。 

单线程架构

Redis 使⽤了单线程架构来实现⾼性能的内存数据库服务,⾸先通过多个客⼾端命令调⽤的例
⼦说明 Redis 单线程命令处理机制,接着分析 Redis 单线程模型为什么性能如此之⾼,最终给出为什么理解单线程模型是使⽤和运维 Redis 的关键。 

现在开启了三个 redis-cli 客⼾端同时执⾏命令。
客⼾端 1 设置⼀个字符串键值对:
127.0.0.1:6379> set hello world
客⼾端 2 对 counter 做⾃增操作:
127.0.0.1:6379> incr counter
客⼾端 3 对 counter 做⾃增操作:
127.0.0.1:6379> incr counter

我们已经知道从客⼾端发送的命令经历了:发送命令、执⾏命令、返回结果三个阶段,其中我们
重点关注第 2 步。我们所谓的 Redis 是采⽤单线程模型执⾏命令的是指:虽然三个客⼾端看起来是同时要求 Redis 去执⾏命令的,但微观⻆度,这些命令还是采⽤线性⽅式去执⾏的,只是原则上命令的执⾏顺序是不确定的,但⼀定不会有两条命令被同步执⾏,可以想象 Redis内部只有⼀个服务窗⼝,多个客⼾端按照它们达到的先后顺序被排队在窗⼝前,依次接受 Redis 的服务,所以两条 incr 命令⽆论执⾏顺序,结果⼀定是 2,不会发⽣并发问题,这个就是 Redis 的单线程执⾏模型。 

 

 Redis 的单线程模型 

 2. 为什么单线程还能这么快
通常来讲,单线程处理能⼒要⽐多线程差,例如有 10 000 公⽄货物,每辆⻋的运载能⼒是每次
200 公⽄,那么要 50 次才能完成;但是如果有 50 辆⻋,只要安排合理,只需要依次就可以完成任务。那么为什么 Redis 使⽤单线程模型会达到每秒万级别的处理能⼒呢?可以将其归结为三点:

a. 纯内存访问。Redis 将所有数据放在内存中,内存的响应时⻓⼤约为 100 纳秒,这是 Redis 达
到每秒万级别访问的重要基础。
b. ⾮阻塞 IO。Redis 使⽤ epoll 作为 I/O 多路复⽤技术的实现,再加上 Redis ⾃⾝的事件处理模型
将 epoll 中的连接、读写、关闭都转换为事件,不在⽹络 I/O 上浪费过多的时间。
c. 单线程避免了线程切换和竞态产⽣的消耗。单线程可以简化数据结构和算法的实现,让程序模
型更简单;其次多线程避免了在线程竞争同⼀份共享数据时带来的切换和等待消耗。

虽然单线程给 Redis 带来很多好处,但还是有⼀个致命的问题:对于单个命令的执⾏时间都是有
要求的。如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客⼾端的阻塞,对于 Redis 这种⾼性能的服务来说是⾮常严重的,所以 Redis 是⾯向快速执⾏场景的数据库。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

群控系统服务端开发模式-数据库设计图

根据整理的业务需求可以发现,本系统数据库针对1.0版本就分两种库。第一类是管理层的数据库,分别是管理员表、角色表、菜单表、部门表、级别表。分别对应控制权限及数据权限。 一、管理层数据库设计图 二、业务层数据库设计图

潜水定位通信系统的功能和使用方法_鼎跃安全

潜水定位通信系统是保障潜水安全与作业高效的关键设备。它利用先进的声呐、无线电等技术,可精准定位潜水员位置。在水下能实现潜水员之间以及与水面的双向通信,确保信息及时传递。具备高可靠性和稳定性,即使在复杂水环境中也能正常运行。 一、…

智能体能和人工智能有什么区别?

智能体与人工智能(AI)之间存在明显的区别,尽管两者在技术和应用上有一定的重叠。 一、定义与范畴 人工智能(AI) 人工智能是指通过模拟、延伸和扩展人的智能,使计算机或其他智能设备具有人类智能的一种技术…

Redis --- 第六讲 --- 关于持久化

前言 持久化:MySQL的事务,有四大比较核心的特性 1、原子性 2、一致性 3、持久性 》 把数据存储到硬盘上 》持久,把数据存储在内存上》持久化。重启进程/重启主机之后,数据是否存在。 4、隔离性 Redis是一个内存数据库&#…

如何在忘记密码的情况下解锁 iPhone? 6 种方法分享

您是否因为没有密码而无法解锁您的 iPhone? 别担心,这种情况比你想象的更常见!忘记密码是 iPhone 用户面临的最常见问题之一,而且可能非常令人沮丧 - 但不要绝望。 在这篇文章中,我们将与您分享绕过 iPhone 屏幕密码…

No provider available from registry RegistryDirectory

【中】No provider available from registry RegistryDirectory Dubbo 3.2.9Nacos 2.1.0 最近在做配置文件升级,服务比较多,之前的Dubbo配置各个服务写的比较乱,有的用Nacos上的 data-id,有的又是在自己的服务引入配置 遂准备统一…

记录一次从nacos配置信息泄露到redis写计划任务接管主机

经典c段打点开局。使用dddd做快速的打点发现某系统存在nacos权限绕过 有点怀疑是蜜罐,毕竟nacos这实在是有点经典 nacos利用 老规矩见面先上nacos利用工具打一波看看什么情况 弱口令nacos以及未授权访问,看这记录估计被光顾挺多次了啊 手动利用Nacos-…

软件测试与软件缺陷的基础知识

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

秋招面试题记录_半结构化面试

c八股(可能问的多一点) 1.简单说说C11语法特性 答: 1.auto以及decltype自动类型推导,避免手动声明复杂类型,减少冗长代码提升了可读性和安全性。 2.智能指针 自动释放内存 (具体说说) 有shared和unique 差异主要体现在所有权、内存开销、…

Tesseract OCR 安装

Tesseract OCR 的安装步骤因操作系统的不同而有所区别。以下是针对 Windows、macOS 和 Linux 系统的详细安装指导。 1. Windows 步骤: 下载 Tesseract 安装程序 访问 Tesseract GitHub Release 页面。下载最新版本的安装程序(例如 .exe 文件&#xff0…

【小趴菜前端实习日记5】

实习日记5 一、vue3中如何使用router(获取this)二、ts中用object定义类型太宽泛导致Ts无法推断出正确类型三、动态设置日记封面失败vite动态引入静态资源1.方法一vue3父子组件生命周期执行顺序 2.方法二3.方法三 四、打包问题总结1.The import.meta meta-property i…

整理—Redis

目录 Redis底层的数据结构 ZSet用过吗 Zset 底层是怎么实现的 跳表是怎么实现的? Redis为什么使用跳表而不是用B树? 压缩列表是怎么实现的? Redis 中的 listpack 哈希表是怎么扩容的? String 是使用什么存储的 Redis为什么快&#xf…

最好的ppt模板网站是哪个?做PPT不可错过的18个网站!

现在有很多PPT模板网站,但真正免费且高质量的不多,今天我就分享主流的国内外PPT模板下载网站,并且会详细分析这些网站的优缺点,这些网站都是基于个人实际使用经验的,免费站点会特别标注,让你可以放心下载&a…

C++:模板(2)

目录 非类型模板参数 模板的特化 概念 函数模板特化 类模板特化 全特化 偏特化 模板的分离编译 分离编译的概念 模板的分离编译 ​编辑 模板总结 非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参:在模板参数列表中,跟在class…

STM32L1x 片上温度传感器采用ADC及工厂校准数据提升测量温度精度

背景 由于项目临时需要温度数据,又不想改动硬件了,反正对温度精度要求不算太高,索性就用MCU片上温度传感器的温度,来替代了。这里自己根据网上帖子做了一些测试用例尝试测温,但是,效果都不理想。发现ST官方…

得物App3D博物馆亮相“两博会”,正品保障助力消费体验升级

近日,2024中国体育文化博览会、中国体育旅游博览会(以下简称“两博会”)在苏州国际展览中心盛大开幕。本次展会汇聚了众多国内外体育文化、体育旅游领域的顶尖企业和品牌,共同展示体育产业的发展成果和最新趋势。在C展馆C21展位&a…

Adams函数构建器(Function Builder)教程来了

学会使用函数构建器是在进行Adams仿真分析的必备技能,通过函数构建器可以查询和使用Adams的各种设计时函数和运行时函数,并能够构建用户自己的函数,大多数情况下的力或者驱动都不是简单的数字,而是需要函数来驱动的,那…

GEE数据集:2001年-2019年全球土地覆被估算(GLanCE)

目录 简介 数据集说明 空间信息 代码1 代码2 代码链接 APP链接 结果 引用 许可 网址推荐 知识星球 机器学习 简介 全球土地覆被估算(GLanCE) 全球土地覆被估算(GLanCE)数据集利用 30 米空间分辨率的大地遥感卫星图…

【拯救头痛大作战!有效应对焦虑引发的“脑内风暴”】

在这个快节奏、高压力的时代,焦虑似乎成了许多人难以摆脱的“隐形伴侣”。它不仅悄无声息地侵蚀着我们的心理健康,还可能引发一系列生理反应,其中最常见也最让人苦恼的便是——焦虑导致的头疼。今天,就让我们一起探索如何有效应对…

Linux介绍及常用命令

Linux 系统简介 1969 年,AT&T 公司的⻉尔实验室P MIT 合作开发的 Unix,在于创建⼀个⽤于⼤型、并⾏、多⽤户的操作系统Unix 的推⼴:从学校⾛进企业Unix 的版本要两个: AT&T System V ——就是俗称的 系统 5Berkley Soft…