【Redis】5.常见命令
文章目录2. Redis 常见数据类型2.1 基础知识2.1.2 数据结构和内部编码2.1.3 单线程架构2.2 String 字符串2.2.1 常见命令2.2.1.1 SET2.2.1.2 GET2.2.1.3 MSET批量set2.2.1.4 MGET批量get2.2.1.5 SETNX不存在的话设置键值2. Redis 常见数据类型2.1 基础知识2.1.2 数据结构和内部编码type命令实际返回的就是当前键的数据结构类型它们分别是string字符串、list列表、hash哈希、set集合、zset有序集合但这些只是Redis对外的数据结构。如图所示实际上Redis针对每种数据结构都有自己的底层内部编码实现而且是多种实现这样Redis会在合适的场景选择合适的内部编码。如表所示可以看到每种数据结构都有至少两种以上的内部编码实现例如list数据结构包含了linkedlist和ziplist两种内部编码。同时有些内部编码例如ziplist可以作为多种数据结构的内部实现可以通过object encoding命令查询内部编码127.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 127.0.0.1:6379可以看到hello对应值的内部编码是embstr键mylist对应值的内部编码是ziplist。Redis这样设计有两个好处可以改进内部编码而对外的数据结构和命令没有任何影响这样一旦开发出更优秀的内部编码无需改动外部数据结构和命令就可以改进。例如Redis 3.2提供了quicklist结合了ziplist和linkedlist两者的优势为列表类型提供了一种更为优秀的内部编码实现而对用户来说基本无感知。多种内部编码实现可以在不同场景下发挥各自的优势。例如ziplist比较节省内存但是在列表元素比较多的情况下性能会下降这时候Redis会根据配置选项将列表类型的内部实现转换为linkedlist整个过程用户同样无感知。2.1.3 单线程架构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的单线程模型为什么单线程还能这么快通常来讲单线程处理能力要比多线程差例如有10000公斤货物每辆车的运载能力是每次200公斤那么要50次才能完成但是如果有50辆车只要安排合理只需要一次就可以完成任务。那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢可以将其归结为三点纯内存访问。Redis将所有数据放在内存中内存的响应时长大约为100纳秒这是Redis达到每秒万级别访问的重要基础。非阻塞IO。Redis使用epoll作为I/O多路复用技术的实现再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件不在网络I/O上浪费过多的时间如图所示。单线程避免了线程切换和竞态产生的消耗。单线程可以简化数据结构和算法的实现让程序模型更简单其次多线程避免了在线程竞争同一份共享数据时带来的切换和等待消耗。Redis使用I/O多路复用模型虽然单线程给Redis带来很多好处但还是有一个致命的问题对于单个命令的执行时间都是有要求的。如果某个命令执行过长会导致其他命令全部处于等待队列中迟迟等不到响应造成客户端的阻塞对于Redis这种高性能的服务来说是非常严重的所以Redis是面向快速执行场景的数据库。问题redis虽然是单线程模型为啥效率这么高呢?速度这么快呢?首先说他快是和其他数据库比较得来的。redis访问内存数据库则是访问硬盘。redis核心功能比数据库的核心功能更简单。数据库对于数据的插入删除查询…都有更复杂的功能支持这样的功能势必要花费更多的开销。比如针对插入删除数据库中的各种约束都会使数据库做额外的工作。redis干的活少提供的功能相比于mysql也是少了不少。单线程模型避免了一些不必要的线程竞争开销。就算搞多个线程也提升不大redis每个基本操作都是短平快的。就是简单操作一下内存数据不是什么特别消耗cpu的操作。处理网络I/O的时候使用了epoll这样的I/O多路复用机制关于epoll可以上网搜或者看一下《LInux高性能服务器编程》一个线程就可以管理多个socket。一个服务器服务多个客户端同时就有很多个socket。这些socket上都是无事不刻的在传输数据吗很多情况下每个客户端和服务器之间的通信也没那么频繁。此时这么多socket大部分时间都是静默的上面是没有数据需要传输的。针对TCP来说服务器这边每次要服务一个客户端都需要给这个客户端安排一个socket。同一时刻只有少数socket是活跃的。2.2 String 字符串字符串类型是Redis最基础的数据类型关于字符串需要特别注意首先Redis中所有的键的类型都是字符串类型而且其他几种数据结构也都是在字符串类似基础上构建的。例如列表和集合的元素类型是字符串类型所以字符串类型能为其他4种数据结构的学习奠定基础。其次如图所示字符串类型的值实际可以是字符串包含一般格式的字符串或者类似JSON、XML格式的字符串数字可以是整型或者浮点型甚至是二进制流数据。例如图片、音频、视频等。不过一个字符串的最大值不能超过512MB。因为redis是单线程模型希望进行的动作比较快速。字符串数据类型由于Redis内部存储字符串完全是按照二进制流的形式保存的所以Redis是不处理字符集编码问题的客户端传入的命令中使用的是什么字符集编码就存储什么字符集编码。2.2.1 常见命令2.2.1.1 SET将 string 类型的 value 设置到 key 中。如果 key 之前存在则覆盖无论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。语法SET key value [expiration EX seconds|PX milliseconds] [NX|XX]命令有效版本1.0.0之后时间复杂度O(1)选项SET命令支持多种选项来影响它的行为EX seconds—— 使用秒作为单位设置key的过期时间。PX milliseconds—— 使用毫秒作为单位设置key的过期时间。NX—— 只在key不存在时才进行设置即如果key之前已经存在设置不执行。XX—— 只在key存在时才进行设置即如果key之前不存在设置不执行。注意由于带选项的SET命令可以被SETNX、SETEX、PSETEX等命令代替所以之后的版本中Redis可能进行合并。返回值如果设置成功返回OK。如果由于SET指定了NX或者XX但条件不满足SET不会执行并返回 (nil)。示例rootyudukai:~# redis-cli 127.0.0.1:6379 exists mykey (integer) 0 127.0.0.1:6379 set mykey Hello OK 127.0.0.1:6379 get mykey Hello 127.0.0.1:6379 set mykey World NX # 不存在时设置 (nil) 127.0.0.1:6379 DEL mykey (integer) 1 127.0.0.1:6379 exists mykey (integer) 0 127.0.0.1:6379 set mykey World XX # 存在时设置 (nil) 127.0.0.1:6379 get mykey (nil) 127.0.0.1:6379 set mykey World NX # 不存在时设置 OK 127.0.0.1:6379 get mykey World 127.0.0.1:6379 set mykey Will expire in 10s EX 10 OK 127.0.0.1:6379 get mykey Will expire in 10s 127.0.0.1:6379 get mykey # 10s后 (nil) 127.0.0.1:6379redis文档给出的语法格式说明:[]相当于一个独立的单元表示可选项(可有可无的)其中|表示或者”的意思多个只能出现一个[]和[]之间是可以同时存在的。如果key不存在创建新的键值对。如果key存在则是让新的value覆盖旧的value可能会改变原来的数据类型。原来这个key的ttI(生存时间)也会失效。高危命令FLUSHALL可以删掉Redis上的所有值。初学阶段可以玩一下公司环境玩的话就是年终奖消失术了。2.2.1.2 GET获取key对应的value。如果key不存在返回nil。如果value的数据类型不是string会报错。语法GET key命令有效版本1.0.0之后时间复杂度O(1)返回值key对应的value或者nil当key不存在。示例127.0.0.1:6379 get nonexisting (nil) 127.0.0.1:6379 set mykey hello OK 127.0.0.1:6379 get mykey hello 127.0.0.1:6379 del mykey (integer) 1 127.0.0.1:6379 exists mykey (integer) 0 127.0.0.1:6379 hset mykey name Bob (integer) 1 127.0.0.1:6379 get mykey (error) WRONGTYPE Operation against a key holding the wrong kind of value # 告诉我们类型有问题 127.0.0.1:63792.2.1.3 MSET批量set一次性设置多个key的值。MSET key value [key value ...]命令有效版本1.0.1之后时间复杂度O(N)N是key数量返回值永远是OK示例127.0.0.1:6379 mset key1 hello key2 world OK 127.0.0.1:6379 get key1 hello 127.0.0.1:6379 get key2 world 127.0.0.1:63792.2.1.4 MGET批量get一次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string返回nil。语法MGET key [key ...]命令有效版本1.0.0之后时间复杂度O(N)N是key数量返回值对应value的列表示例127.0.0.1:6379 set key1 hello OK 127.0.0.1:6379 set key2 world OK 127.0.0.1:6379 mget key1 key2 nothing 1) hello 2) world 3) (nil) 127.0.0.1:6379多次getvs 单次mget如上图所示使用mget/mset由于可以有效地减少了网络时间所以性能相较更高。假设网络耗时1毫秒命令执行时间耗时0.1毫秒则执行时间如下表所示。1000次get和1次mget对比操作时间1000次get1000 x 1 1000 x 0.1 1100 毫秒1次mget 1000个键1 x 1 1000 x 0.1 101 毫秒学会使用批量操作可以有效提高业务处理效率但是要注意每次批量操作所发送的键的数量也不是无节制的否则可能造成单一命令执行时间过长导致Redis阻塞。例如你一次性设置一百万个键值对。2.2.1.5 SETNX不存在的话设置键值设置key-value但只允许在key之前不存在的情况下。语法SETNX key value命令有效版本1.0.0之后时间复杂度O(1)返回值1表示设置成功。0表示没有设置。示例127.0.0.1:6379 SETNX mykey Hello # 不存在可以设置 (integer) 1 127.0.0.1:6379 SETNX mykey world # 存在不可以设置 (integer) 0 127.0.0.1:6379 get mykey Hello 127.0.0.1:6379SET、SET NX、SET XX执行流程SETNX不存在才能设置存在则设置失败。SETEX设置key的过期时间单位是秒PSETEX设置key的过期时间单位是毫秒

相关新闻

Tiva™ TM4C123 GPTM定时器寄存器配置与中断管理实战指南

Tiva™ TM4C123 GPTM定时器寄存器配置与中断管理实战指南

1. GPTM控制与中断管理:从寄存器到实战的深度解析 在嵌入式开发中,定时器是驱动整个系统心跳的核心。无论是实现一个简单的LED闪烁延时,还是构建一个复杂的电机FOC控制算法,其底层都离不开对通用定时器模块的精准操控。Tiva™ TM4…

2026/10/17 10:32:00 阅读更多 →
C/C++动态规划入门:从路径问题掌握DP四步心法与代码实现

C/C++动态规划入门:从路径问题掌握DP四步心法与代码实现

1. 项目概述:为什么从路径问题切入动态规划? 如果你刚开始接触C/C算法,看到“动态规划”四个字,可能觉得它高深莫测,是面试大厂时才需要面对的“拦路虎”。但我想告诉你,动态规划(Dynamic Progr…

2026/10/17 7:22:51 阅读更多 →
工业阀门智能检测系统:基于YOLOv8的优化与应用

工业阀门智能检测系统:基于YOLOv8的优化与应用

1. 项目概述:工业阀门智能检测系统全栈解决方案这套工业阀门类型检测系统是基于YOLOv8目标检测框架构建的端到端解决方案,专为工业质检场景设计。我在石油管道阀门检测项目中验证过这套方案,实测对DN50-DN300规格的闸阀、球阀、蝶阀识别准确率…

2026/10/17 15:56:05 阅读更多 →

最新新闻

AI辅助编写教材:从查重原理到个性化改写的完整实战

AI辅助编写教材:从查重原理到个性化改写的完整实战

很多人第一次拿到AI生成的教材初稿时,心里其实是犯嘀咕的:内容看起来像那么回事,但送去查重一测,重复率愣是能冲到百分之四五十,个别段落甚至被标红一大片。这其实是AI写教材最常见的翻车现场,也是这篇文章…

2026/10/19 3:41:16 阅读更多 →
本地化代码审查工作流:CLI+Git+LLM 实现离线自动化 Code Review

本地化代码审查工作流:CLI+Git+LLM 实现离线自动化 Code Review

1. 项目概述:这不是一个“工具”,而是一套可落地的开源代码审查工作流open-code-review 这个名字乍看像某个具体软件,但实际它代表的是一类正在快速成型的工程实践——用开源、可审计、可定制的 CLI 工具链,把大语言模型&#xff…

2026/10/19 3:41:16 阅读更多 →
FPGA数字钟Verilog实战:分频、消抖、数码管与闹铃全解析

FPGA数字钟Verilog实战:分频、消抖、数码管与闹铃全解析

简介:这份资源是面向FPGA初学者与数字电路学习者的Verilog时钟设计工程包,围绕时钟计时、闹铃、整点报时与按键去抖等实用功能展开,适合作为HDL入门练手或课程设计参考。压缩包共101个文件,约3.83MB,以Quartus工程文件…

2026/10/19 3:41:16 阅读更多 →
基于CNN的灰度图自动着色系统:ECCV16 PyTorch复现与工程落地

基于CNN的灰度图自动着色系统:ECCV16 PyTorch复现与工程落地

简介:本资源是一份基于卷积神经网络(CNN)实现图像自动着色的完整Python项目源码,面向计算机科学、人工智能、数据科学等专业的在校学生、课程教师及初学者,适用于深度学习入门实践、课程设计、大作业或毕设参考。项目复…

2026/10/19 3:41:16 阅读更多 →
智能家居全国交付的县域节点架构:远程技术大脑与本地执行端的标准化实现

智能家居全国交付的县域节点架构:远程技术大脑与本地执行端的标准化实现

一、背景/痛点分析 异地县域项目是智能家居全国交付的典型压力测试。某北方小县城项目,绿米生态适配验证中,设备数量三四十个,B端客户有前端订单,但交付能力覆盖不到该县域。 B端客户曾在当地找过低报价交付资源,对方承…

2026/10/19 3:41:16 阅读更多 →
深度学习模型集成实操指南:原理、策略与工程落地

深度学习模型集成实操指南:原理、策略与工程落地

1. 模型集成到底在解决什么问题先说个实际场景。你训了一个深度学习模型,验证集上准确率已经做到92%,再往上调结构、调学习率、加数据增强,折腾两周纹丝不动。这时候有个老选手跟你说:把三个不同seed训出来的模型平均一下&#xf…

2026/10/19 3:40:16 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →