Redis 基本全局命令和单线程架构

devtools/2025/2/11 22:01:32/
Redis 提供了许多命令来管理和操作数据,以下是一些常用的全局命令,这些命令可以帮助你管理和监控 Redis 服务器的状态、配置和数据。

KEYS

语法:
KEYS pattern
时间复杂度:O(N)
返回所有满⾜样式(pattern)的 key。⽀持如下统配样式。
  • h?llo ,其中?可以替代任一字符,可以匹配如 hello , hallo hxllo
  • h*llo ,其中 * 可以替代任一段字符,可以匹配如 hllo 和 heeeello
  • h[ae]llo ,其中 [ ] 表示可以替代 [ ] 内的任一字符,可以匹配如 hello 和 hallo 但不匹配 hillo
  • h[^e]llo ,其中 [^ ] 表示不可以替代 [ ] 内的任一字符,可以匹配 hallo , hbllo , ... 但不匹配 hello
  • h[a-b]llo ,其中 [ ] 中的 - 表示可以替代 [ ] 内的字符范围,可以匹配如 hallo hbllo

EXISTS

判断某个 key 是否存在。
语法:
EXISTS key [key ...]
时间复杂度:O(1)
返回值:key 存在的个数。

DEL

删除指定的 key。
语法:
DEL key [key ...]
时间复杂度:O(1)
返回值:删除掉的 key 的个数。

FLUSHALL

清空所有数据库中的所有键。
语法:
FLUSHALL

EXPIRE

为指定的 key 添加秒级的过期时间(Time To Live TTL)
语法:
​​​​​​​EXPIRE key seconds
时间复杂度:O(1)
返回值:1 表⽰设置成功。0 表⽰设置失败。
EXPIRE 命令都有对应的⽀持毫秒为单位的版本:PEXPIRE ,用法与 EXPIRE 一致。

TTL

获取指定 key 的过期时间,秒级。
语法:
TTL key
时间复杂度:O(1)
返回值:剩余过期时间。-1 表⽰没有关联过期时间,-2 表⽰ key 不存在。
示例:
TTL 命令都有对应的⽀持毫秒为单位的版本:PTTl ,用法与 TTL 一致。

TYPE

返回 key 对应的数据类型。
语法:
TYPE key
时间复杂度:O(1)
返回值: none , string , list , set , zset , hash and stream

数据结构和内部编码

type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是 Redis 对外的数据结构。实际上 Redis 针对每种数据结构都有⾃⼰的底层内部编码实现,⽽且是多种实现,这样 Redis 会在合适的场景选择合适的内部编码,如图所⽰。

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

单线程架构

Redis 使⽤了单线程架构来实现⾼性能的内存数据库服务,例如现在开启了三个 redis-cli 客⼾端同时执⾏命令。
  • 客⼾端 1 设置⼀个字符串键值对:
set counter 0
  • 客⼾端 2 对 counter 做⾃增操作:
incr counter
  • 客⼾端 3 对 counter 做⾃增操作:
incr counter
我们已经知道从客⼾端发送的命令经历了:发送命令、执⾏命令、返回结果三个阶段,其中我们重点关注第 2 步。我们所谓的 Redis 是采⽤单线程模型执⾏命令的是指:虽然三个客⼾端看起来是同时要求 Redis 去执⾏命令的,但微观⻆度,这些命令还是采⽤线性⽅式去执⾏的,只是原则上命令的执⾏顺序是不确定的,但⼀定不会有两条命令被同步执⾏,如图 2-3、2-4、2-5 所⽰,可以想象 Redis 内部只有⼀个服务窗⼝,多个客⼾端按照它们达到的先后顺序被排队在窗⼝前,依次接受 Redis 的服务,所以两条 incr 命令⽆论执⾏顺序,结果⼀定是 2,不会发⽣并发问题,这个就是 Redis 的单线程执⾏模型。
​​​​​​​

为什么单线程还能这么快

通常来讲,单线程处理能⼒要⽐多线程差,例如有 10000 公⽄货物,每辆⻋的运载能⼒是每次
200 公⽄,那么要 50 次才能完成;但是如果有 50 辆⻋,只要安排合理,只需要依次就可以完成任务。那么为什么 Redis 使⽤单线程模型会达到每秒万级别的处理能⼒呢?可以将其归结为三点:
  • 纯内存访问。Redis 将所有数据放在内存中,内存的响应时⻓⼤约为 100 纳秒,这是 Redis 达到每秒万级别访问的重要基础。
  • ⾮阻塞 IO。Redis 使⽤ epoll 作为 I/O 多路复⽤技术的实现,再加上 Redis ⾃⾝的事件处理模型将 epoll 中的连接、读写、关闭都转换为事件,不在⽹络 I/O 上浪费过多的时间,如图 2-6 所⽰。
  • 单线程避免了线程切换和竞态产⽣的消耗。单线程可以简化数据结构和算法的实现,让程序模 型更简单;其次多线程避免了在线程竞争同⼀份共享数据时带来的切换和等待消耗。
虽然单线程给 Redis 带来很多好处,但还是有⼀个致命的问题:对于单个命令的执⾏时间都是有要求的。如果某个命令执⾏过⻓,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客⼾
端的阻塞,对于 Redis 这种⾼性能的服务来说是⾮常严重的,所以 Redis 是⾯向快速执⾏场景的数据库


http://www.ppmy.cn/devtools/158036.html

相关文章

快速搭建 Elasticsearch 8 集群:零基础实战与升级注意事项

引言 随着大数据技术的飞速发展,Elasticsearch 成为许多应用场景中不可或缺的技术,它以其高效的全文搜索引擎和分布式存储架构在企业和个人项目中占据了一席之地。无论是在日志分析、实时搜索还是数据可视化中,Elasticsearch 都发挥着重要的作用。 在这篇文章中,我们将为…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue旅游管理网站

开题报告 本论文探讨了一款采用现代Web开发技术构建的台州市旅游综合信息与服务平台的设计与实现。该系统基于SpringBoot框架,以其轻量级、快速开发和强大的企业级应用支持能力为核心后端技术支撑,结合Vue.js前端框架及ElementUI组件库,为用…

CSDN 博客之星 2024:肖哥弹架构的社区耕耘总结

#博客之星2024年度总评选—主题文章创作# CSDN 博客之星 2024:肖哥弹架构的社区耕耘总结 肖哥弹架构 是一位专注于技术分享和社区建设的博客作者。今年,我荣幸地再次入选CSDN博客之星TOP300,这不仅是对我过去努力的认可,更是对未…

web3是什么,最简单的介绍

Web3是指第三代互联网技术,也被称为分布式互联网。它是在传统互联网(Web2.0)基础上发展出来的一种新技术体系,旨在通过区块链技术来重新定义人们访问和使用网络服务的方式。以下是关于Web3的详细介绍: 一、核心特点 …

多模态识别和自然语言处理有什么区别

在科技飞速发展的当下,人工智能(AI)已经渗透到我们生活的方方面面。不知道大家有没有这样的经历:早上醒来,对着智能音箱说 “播放今天的新闻”,音箱不仅能识别你的语音,还能在播放新闻的同时&am…

适用于 Windows 的 Zed 编辑器的非官方稳定版。通过 scoop 或 pwsh 脚本轻松安装。不隶属于 Zed Industries

一、软件介绍(文末提供下载) Zed,这是一款由 Atom 和 Tree-sitter 的创建者提供的高性能多人 Atom and Tree-sitter.。 二、macOS 和 Linux安装 在 macOS 和 Linux 上,您可以直接下载 Zed 或通过本地包管理器安装 Zed。 本地包…

企业数据集成案例:吉客云销售渠道到MySQL

测试-查询销售渠道信息-dange:吉客云数据集成到MySQL的技术案例分享 在企业的数据管理过程中,如何高效、可靠地实现不同系统之间的数据对接是一个关键问题。本次我们将分享一个具体的技术案例——通过轻易云数据集成平台,将吉客云中的销售渠…

ArcGIS Pro SDK (二十六)自定义配置

ArcGIS Pro SDK (二十六)自定义配置 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 文章目录 ArcGIS Pro SDK (二十六)自定义配置1 在Config.xaml中添加配置页2 在Module1.cs中添加3 添加配置页CustomSettingsView4 添加配置页视图模型CustomSettingsViewModel1 …