尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Redis 字符串类型:从命令到场景的系统梳理
一、背景引入Redis 是一个键值存储系统所有数据都以「键key- 值value」的形式存放。其中键的类型永远是字符串而值的类型有五种字符串、列表、集合、哈希、有序集合。字符串类型是最基础、使用最广泛的一种也是理解其他四种结构的起点 —— 列表、集合、哈希、有序集合里的元素底层其实都是字符串。这篇博客就围绕 Redis 的键和 string 类型展开把它的原理、常用命令和典型使用场景串起来做一次完整复盘二、核心原理先搞清楚 字符串类型到底能存什么。文档里明确说字符串类型的值可以是四类1.普通格式的字符串比如 hello2.JSON、XML 这类结构化格式的字符串3.数字可以是整型也可以是浮点型4.二进制流数据比如图片、音频、视频。但无论存什么一个字符串的最大值不能超过512MB这里有一个很多人没注意到的细节Redis 内部保存字符串完全是按二进制流形式的所以它不处理字符集编码问题。客户端传入的命令用什么编码它就原样存什么编码。这意味着在 Redis 里 字符串 不是一个带字符集概念的文本类型而是一段原始的字节序列 —— 这也是它能放心存二进制数据的原因三、命令的解析与使用3.1 基础读写命令SET / GET3.1.1:SETSET:将string 类型的value设置到key中,如果key之前存在则覆盖无论原来的数据类型是什么,之前关于此key的TTL也全部失效语法:SET key value [expiration EX seconds|PX milliseconds] [NX|XX]命令有效版本1.0.0之后时间复杂度O(1)选项 SET命令支持多种选项来影响它的行为(1) EX seconds⸺使用秒作为单位设置key的过期时间(2) PX milliseconds⸺使用毫秒作为单位设置key的过期时间(3)NX ⸺只在key不存在时才进行设置即如果key之前已经存在设置不执行(4)XX ⸺只在key存在时才进行设置即如果key之前不存在设置不执行。 注意由于带选项的SET命令可以被 SETNX 、 中Redis可能进行合并返回值(1)如果设置成功返回OK。 SETEX 、 PSETEX 等命令代替所以之后的版本(2)如果由于SET指定了NX或者XX但条件不满⾜SET不会执行并返回(nil)示例:3.1.2:GETGET:获取key对应的value。如果key不存在返回nil。如果value的数据类型不是string会报错语法:GET key命令有效版本1.0.0之后时间复杂度O(1)返回值key对应的value或者nil当key不存在示例:3.2 批量操作MGET / MSET3.2.1:MGETMGET:⼀次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string返回nil语法MGET key [key ...]命令有效版本1.0.0之后时间复杂度O(N)N是key数量返回值对应value的列表示例:3.2.2:MSETMSET:⼀次性设置多个key的值语法MSET key value [key value ...]命令有效版本1.0.1之后时间复杂度O(N)N是key数量返回值永远是OK示例:3.2.3 多次getvs单次mget使⽤mget/mset由于可以有效地减少了⽹络时间所以性能相较更⾼。假设⽹络耗 时1毫秒命令执⾏时间耗时0.1毫秒3.3 条件写入SETNXSETNX:设置key-value但只允许在key之前不存在的情况下语法:SETNX key value命令有效版本1.0.0之后时间复杂度O(1)返回值1表⽰设置成功,0表⽰没有设置示例:3.4 计数命令INCR / INCRBY / DECR / DECRBY / INCRBYFLOAT3.4.1:INCRINCR:将key对应的string表示的数字加⼀。如果key不存在则视为key对应的value是0。如果key对 应的string不是⼀个整型或者范围超过了64位有符号整型则报错语法:INCR key命令有效版本1.0.0之后时间复杂度O(1)返回值integer类型的加完后的数值示例:3.4.2:INCRBYINCRBY:将key对应的string表示的数字加上对应的值,如果key不存在则视为key对应的value是0,如 果key对应的string不是⼀个整型或者范围超过了64位有符号整型则报错语法:INCRBY key decrement命令有效版本1.0.0之后时间复杂度O(1)返回值integer类型的加完后的数值示例:3.4.3:DECRDECR:将key对应的string表示的数字减一,如果key不存在则视为key对应的value是0,如果key对应的string不是一个整型或者范围超过了64位有符号整型则报错语法:DECR key命令有效版本1.0.0之后时间复杂度O(1)返回值integer类型的减完后的数值示例:3.4.4:DECYBY示例:将key对应的string表⽰的数字减去对应的值,如果key不存在则视为key对应的value是0,如 果key对应的string不是⼀个整型或者范围超过了64位有符号整型则报错语法:DECRBY key decrement命令有效版本1.0.0之后时间复杂度O(1)返回值integer类型的减完后的数值示例:3.4.5:INCRBYFLOATINCRBYFLOAT:将key对应的string表⽰的浮点数加上对应的值,如果对应的值是负数则视为减去对应的值,如果key 不存在则视为key对应的value是0,如果key对应的不是string或者不是⼀个浮点数则报错,允许采⽤科学计数法表示浮点数INCRBYFLOAT key increment命令有效版本2.6.0之后时间复杂度O(1)返回值加/减完后的数值示例:3.5. 其他命令APPEND / GETRANGE / SETRANGE / STRLEN3.5.1 APPENDAPPEND:如果key已经存在并且是⼀个string命令会将value追加到原有string的后边。如果key不存在 则效果等同于SET命令语法:APPEND KEY VALUE命令有效版本2.0.0之后时间复杂度O(1).追加的字符串⼀般长度较短,可以视为O(1)返回值追加完成之后string的长度示例:3.5.2 GETRANGEGETRANGE:返回key对应的string的子串由start和end确定左闭右闭),可以使用负数表示倒数,-1代表倒数第⼀个字符-2代表倒数第⼆个其他的与此类似,超过范围的偏移量会根据string的长度调整成正确的值语法:GETRANGE key start end命令有效版本2.4.0之后时间复杂度O(N).N为[start,end]区间的⻓度.由于string通常⽐较短,可以视为是O(1)返回值string类型的⼦串示例:3.5.3 SETRANGESETRANGE:覆盖字符串的⼀部分从指定的偏移开始语法:SETRANGE key offset value命令有效版本2.2.0之后时间复杂度O(N),N为value的长度.由于⼀般给的value⽐较短,通常视为O(1).返回值替换后的string的长度示例:3.5.4 STRLENSTRLEN:获取key对应的string的⻓度,当key存放的类似不是string时报错语法:STRLEN key命令有效版本2.2.0之后时间复杂度O(1)返回值string的⻓度。或者当key不存在时返回0示例:3.6 内部编码int /embstr/raw字符串类型有三种内部编码Redis 会根据当前值的类型和长度动态选择int8 字节的长整型embstr小于等于39 字节的字符串raw大于 39 字节的字符串。用 object encoding key 命令可以查看某个键当前用了哪种编码,这个细节对我理解 为什么有的键省内存、有的键慢 很有帮助 —— 短的用小对象编码长的走完整对象结构本身就是一种内存优化3.7 键名设计规范与 MySQL 这类关系型数据库不同Redis没有表、字段这种命名空间对键名也没有强制要求除了一些特殊字符,但合理的键名能防冲突、保可维护性。文档推荐用 业务名:对象名:唯一标识:属性 的格式。比如 MySQL 数据库名是 vs、用户表是 user_info对应键可以写成 vs:user_info:6379、vs:user_info:6379:name两个优化点1.如果 Redis 只被一个业务使用可以省略业务名 vs:2.如果键名过长可以用团队认可的缩写比如 user:6379:friends:messages:5217 简化为 u:6379:fr:m:5217—— 因为键名过长会导致 Redis 性能明显下降四.重点回顾定位Redis 所有键都是字符串字符串也是最基础的值类型其他四种结构列表 / 集合 / 哈希 / 有序集合都基于它构建能存什么普通字符串、JSON/XML、数字整型或浮点、二进制流最大 512MB内部按二进制流存储不处理字符集编码SET覆盖原值并清空 TTL支持 EX/PX/NX/XX 选项可替代 SETNX/SETEX/PSETEXGET取 string 值key 不存在返回 nil类型不是 string 报 WRONGTYPE批量MGET/MSET 通过减少网络往返提速1000 个键从 1100ms 降到 101ms但键数量要克制避免单条命令过长阻塞 RedisSETNX仅 key 不存在时设置等价 SET key value NX计数INCR/DECR/INCRBY/DECRBY/INCRBYFLOAT 原子自增自减key 不存在视为 0非整型或超 64 位有符号报错单线程天然保证原子性无需 CAS子串与长度APPEND 追加、GETRANGE 取子串左闭右闭、支持负数、SETRANGE 偏移覆盖、STRLEN 取长度多为 O (1)内部编码int8 字节长整型、embstr≤39 字节、raw39 字节动态选择可用 object encoding 查看键名推荐 业务名:对象名:唯一标识:属性单业务可省业务名键名过长拖慢性能可约定缩写。易错点SET 无条件覆盖GET 类型不匹配报错计数越界报错分布式下 Session 分散存储会导致掉线重登本期博客到此结束,记得多总结,多回顾!!!
RELATED

相关推荐

Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)

Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…

📅 2026/10/9 10:19:12
Sapling 开发者快速上手指南:从源码构建、测试到扩展开发

Sapling 开发者快速上手指南:从源码构建、测试到扩展开发

开发工具CLI后端 【免费下载链接】sapling A Scalable, User-Friendly Source Control System. 项目地址: https://gitcode.com/gh_mirrors/sa/sapling 点击查看 免费下载 本篇技术指南以 Sapling(Meta 开源的源码控制系统)开发流程为核心&a…

📅 2026/10/9 10:14:10
SpringBoot+微信小程序:生猪养殖信息化管理系统的设计与落地

SpringBoot+微信小程序:生猪养殖信息化管理系统的设计与落地

搞了三个多月,总算是把这套“基于SpringBoot与微信小程序的生猪养殖信息化管理系统”从零到一完整落地了。一句话说清楚它是什么:一套面向中小规模养殖场的数字化台账工具,后端用SpringBoot提供接口服务,前端用微信小程序做移动端…

📅 2026/10/9 10:14:10
MORE NEWS

更多资讯

📰

小波分解+BP神经网络风电功率预测实战指南

简介:本资源是一份面向电力系统、新能源预测及人工智能应用方向的科研与工程实践者的技术文档,聚焦风电功率不确定性带来的电网调度难题,提出融合小波分析与BP神经网络的高精度短期预测方法。文档系统阐述了小波分解(DB4四层&…

📰

Vue+ECharts动态地图实战:数据驱动着色与下钻联动

1. 项目背景与核心需求拆解1.1 为什么要在Vue项目里做动态地图做过数据大屏或者后台管理系统的朋友应该都有体会,静态地图早就满足不了业务需求了。所谓动态地图,核心诉求无非这么几类:地图区域能根据数据变化自动着色、点击某个省份能下钻到…

📰

浏览器插件开发避坑指南:Manifest V3实战通信与状态管理

1. 这不是教程,是我在三年里踩过27次坑后整理的浏览器插件开发实录“浏览器插件开发终极指南:从入门到精通”——这个标题听起来像极了那种点开前信心满满、读完后怀疑人生的文档。我第一次写插件时,也是被“5分钟上手”“一行代码搞定”这类…

📰

PHP集成活体识别全流程:签名验签与阈值配置实战

做风控的同行应该都有这种感觉:活体识别这东西,听起来就是个“成熟的第三方接口”,文档看着也简单,但真正要接进PHP业务系统,尤其是要承担合规审查责任的时候,细节全在坑里。我最近刚帮业务线做完一轮身份核…

📰

AI编程实战指南:从提示词到代码副驾驶的高效用法

很多人跟我说,AI写代码就是“人工智障”,让它写个排序算法都能跑出一堆莫名其妙的报错。我一开始也这么觉得,直到我花了两周时间认真研究了一下自己到底是怎么提问的,才反应过来:不是AI太蠢,是我根本没把它…

📰

锐捷云桌面部署实战:从选型到运维的踩坑经验分享

1. 从一台老旧PC的报废说起:为什么我开始折腾云桌面办公室角落里那台五年前的品牌机,开机要三分半,打开浏览器再卡两分钟,硬盘灯狂闪像在求救。IT运维的同事每次路过都要叹口气,说这台机器再撑半年就该进回收站了。但问…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬