【Redis】string类型
目录
- 1、介绍
- 2、底层实现
- 【1】SDS
- 【2】int编码
- 【3】embstr编码
- 【4】raw编码
- 【5】embstr和raw的区别
- 3、常用指令
- 【1】字符串基本操作:
- 【2】批量操作
- 【3】计数器
- 【4】过期时间
- 【5】不存在就插入
- 4、使用场景
1、介绍
string是redis中最简单的键值对形式,它的value除了可以是字符串,还可以是数字、二进制数据,value的最大长度为521M,其底层主要通过int和SDS(简单动态字符串)组成。
2、底层实现
【1】SDS
SDS是redis的底层数据结构之一,其结构如下:
struct sdshdr {int len; // 已使用的字节数int free; // 未使用的空闲字节数char buf[]; // 存储字符的柔性数组
};
其功能为:
| 功能 | 解释 |
|---|---|
| 预分配空间 | 当字符串增长时,free记录额外分配的空间,避免频繁内存重新分配 |
| 惰性释放 | 当字符串缩短时,free记录回收的空间,供后续复用,不会立即释放 |
与C字符串相比:
| 特性 | C字符串 | SDS |
|---|---|---|
| 长度获取 | 遍历到\0,时间复杂度为O(N) | 直接读len,时间复杂度为O(1) |
| 修改时的内存重分配 | 每次修改均需重分配 | 通过free进行"预分配/惰性释放" |
| 二进制安全 | 无法存储含\0的数据 | 通过len判断边界,支持二进制存储 |
【2】int编码
当string类型存储整型数据时,底层就采用了int编码方式,其存储结构可以如图表示:

【3】embstr编码
如果string类型存储字符串数据时,当字符串长度比较小时,也就是小于44字节(redis不同版本有差异),就采用embstr编码来存储短字符串,这时就用到了SDS数据结构,其存储结构如图表示:

【4】raw编码
如果string类型存储字符串数据时,当字符串长度大于44字节时,就采样raw编码来存储字符串,虽然raw编码也使用了SDS数据结构,但是和redis的基本结构不是连续的,结构如图所示:

【5】embstr和raw的区别
embstr编码和raw编码的区别如下:
| 对比维度 | embstr | raw |
|---|---|---|
| 存储结构 | RedisObject和SDS连续存储在同一内存块 | RedisObject和SDS分来存储 |
| 内存分配次数 | 1次分配 | 2次分配 |
| 访问效率 | 更高,内存连续 | 稍低,两次访问 |
| 修改时的行为 | 任何修改操作都会转换为raw编码 | 直接修改 |
| 适用场景 | 短字符串 | 长字符串 |
| 内存碎片 | 更少 | 更多 |
| 最大长度 | 44B | 521MB |
3、常用指令
【1】字符串基本操作:
#设置key-value
127.0.0.1:6379[2]> set animal cat
OK#查看key对应的value
127.0.0.1:6379[2]> get animal
"cat"#判断key是否存在,存在返回1
127.0.0.1:6379[2]> exists animal
(integer) 1#判断key是否存在,不存在返回0
127.0.0.1:6379[2]> exists work
(integer) 0#获取key的长度
127.0.0.1:6379[2]> strlen animal
(integer) 3#删除对应的key-value
127.0.0.1:6379[2]> del animal
(integer) 1
【2】批量操作
#批量设置key-value
127.0.0.1:6379[2]> mset animal cat hobby eat
OK#批量获取key-value
127.0.0.1:6379[2]> mget animal hobby
1) "cat"
2) "eat"
【3】计数器
#设置数字10
127.0.0.1:16379[2]> set number 10
OK
127.0.0.1:16379[2]> get number
"10"#number自增+1
127.0.0.1:6379[2]> incr number
(integer) 11
127.0.0.1:6379[2]> get number
"11"#number自增+100
127.0.0.1:6379[2]> incrby number 100
(integer) 111
127.0.0.1:6379[2]> get number
"111"#number自增-1
127.0.0.1:6379[2]> decr number
(integer) 110
127.0.0.1:6379[2]> get number
"110"#number自增-100
127.0.0.1:6379[2]> decrby number 100
(integer) 10
127.0.0.1:6379[2]> get number
"10"
【4】过期时间
#查看key的过期时间,-1代表永不过期
127.0.0.1:6379[2]> ttl animal
(integer) -1#给已存在的key设置过期时间
127.0.0.1:6379[2]> expire animal 60
(integer) 1
#还剩58秒过期
127.0.0.1:6379[2]> ttl animal
(integer) 58
#-2代表key不存在,也就是已过期
127.0.0.1:6379[2]> ttl animal
(integer) -2#设置key-value并设置过期时间,第一种设置方式
127.0.0.1:6379[2]> set cat sleep ex 60
OK
127.0.0.1:6379[2]> ttl cat
(integer) 57#设置key-value并设置过期时间,第二种设置方式
127.0.0.1:6379[2]> setex dog 60 play
OK
127.0.0.1:6379[2]> ttl dog
(integer) 54
【5】不存在就插入
#返回1代表不存在插入成功
127.0.0.1:6379[2]> setnx animal cat
(integer) 1#返回0表达已存在插入失败
127.0.0.1:6379[2]> setnx animal cat
(integer) 0
4、使用场景
string类型根据其特性的使用场景如下:
| 特性 | 说明 | 场景 |
|---|---|---|
| 原子操作 | 支持INCR/DECR等原子操作 | 计数器、限流器 |
| 批量操作 | MEST/MGET减少网络开销 | 批量缓存读写 |
| 位操作 | SETBIT/GETBIT直接操作二进制位 | 布隆过滤器、位图统计 |
| 过期控制 | EXPIRE实现自动过期 | 会话管理、临时数据缓存 |
相关文章:
【Redis】string类型
目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作:【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式,…...
《解锁分布式软总线:构建智能设备统一管理平台》
智能设备的数量呈爆发式增长,从智能家居里的各类电器,到智能办公中的电脑、打印机,再到工业领域的各种自动化设备,不一而足。如何对这些纷繁复杂的智能设备进行有效管理,成为摆在我们面前的一道难题。分布式软总线技术…...
PostgreSQL全平台安装指南:从入门到生产环境部署
一、PostgreSQL核心特性全景解析 1.1 技术架构深度剖析 graph TDA[客户端] --> B(连接池)B --> C{查询解析器}C --> D[优化器]D --> E[执行引擎]E --> F[存储引擎]F --> G[物理存储]G --> H[WAL日志]H --> I[备份恢复] 1.2 特性优势对比矩阵 特性维度…...
UE5 物理模拟 与 触发检测
文章目录 碰撞条件开启模拟关闭模拟 多层级的MeshUE的BUG 触发触发条件 碰撞 条件 1必须有网格体组件 2网格体组件必须有网格,没有网格虽然可以开启物理模拟,但是不会有任何效果 注意开启的模拟的网格体组件会计算自己和所有子网格的mesh范围 3只有网格…...
做仪器UI用到的颜色工具网站
https://color.adobe.com/zh/create/color-wheel 1. 图片取颜色工具 2. 对比度工具,煤矿井下设备,光线暗,要求背景与文字有合适的对比度,可以用这个软件 3. 颜色生成ARGB的值工具,这三个工具,都在上面这…...
【算法】【蓝桥23国A软件C】四版代码思路分析与逐步优化
题目来源:第十四届蓝桥杯大赛软件赛国赛C/C 大学 A 组 题目描述: 问题描述 给定一个 WH 的长方形,两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗,正方形的边长至少为 2,不允…...
网络安全·第三天·ICMP协议安全分析
一、ICMP功能介绍 ICMP(Internet Control Message Protocal)是一种差错和控制报文协议,不仅用于传输差错报文, 还传输控制报文,但是ICMP只是尽可能交付,提供的服务是无连接、不可靠的,并不能保…...
SpringBoot对接火山引擎大模型api实现图片识别与分析
文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上,在上一篇博客,我们已经实现了spring ai对接本地大模型实现了聊天机器人,但是目前有个新…...
单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发
在电子产品设计中,单片机(MCU)无疑是最重要的组成部分之一。无论是消费电子、智能家居、工业控制,还是可穿戴设备,小家电等,单片机的应用无处不在。 单片机,简而言之,就是将计算机…...
Open Interpreter:重新定义人机交互的开源革命
引言 在人工智能技术蓬勃发展的今天,人机交互的方式正经历着前所未有的变革。Open Interpreter,作为一个开源项目,正在重新定义我们与计算机的互动方式。它允许大型语言模型(LLMs)在本地运行代码,通过自然…...
解决前端使用Axios时的跨域问题
跨域问题是前端开发中常见的问题,当你的前端应用尝试访问不同域名、端口或协议的API时就会出现。以下是几种解决方案: 1. 后端解决方案 CORS (推荐) 后端需要设置正确的响应头: Access-Control-Allow-Origin: * // 或指定具体域名 Acces…...
ARCGIS PRO 在已建工程地图中添加在线地图
一、手工添加 如图所示: 1、在上方的菜单栏中点击“插入”,选择“连接” 2、新建ArcGIS Server 3、在弹出框中输入在线图集的URL,点击“确定” https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer 4、查看在…...
ScholarCopilot:“学术副驾驶“
这里写目录标题 引言:学术写作的痛点与 AI 的曙光ScholarCopilot 的核心武器库:智能生成与精准引用智能文本生成:不止于“下一句”智能引用管理:让引用恰到好处 揭秘背后机制:检索与生成的动态协同快速上手:…...
MATLAB仿真多相滤波抽取与插值的频谱变化(可视化混叠和镜像)
MATLAB画图仿真多相滤波抽取与插值的频谱变化 可视化多速率信号处理抽取与插值的频谱变化 实信号/复信号 可视化混叠和镜像 目录 前言 一、抽取的基本原理 二、MATLAB仿真抽取运算 三、内插的基本原理 四、MATLAB仿真内插运算 总结 前言 在多速率系统中增加信号采样率的运…...
mongodb 远程访问
mongodb 远程访问 MongoDB 数据库的远程访问通常需要一些配置步骤,以确保安全性并正确设置网络访问权限。以下是一些基本步骤来允许远程访问 MongoDB 数据库: 修改 MongoDB 配置文件 首先,你需要编辑 MongoDB 的配置文件(通常是 …...
DAY 44 leetcode 28--字符串.实现strStr()
题号28 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 我的解法 双指针,slow定位&…...
MySQL-存储引擎索引
存储引擎 MySQL体系结构 1). 连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念,为通过认证安…...
图像处理有哪些核心技术?技术发展现状如何?
在数字化信息爆炸的时代,文档图像预处理技术正悄然改变着我们处理文字信息的方式。无论是手持拍摄的收据、扫描仪中的身份证,还是工业机器人采集的复杂文档,预处理技术都在背后默默提升着OCR(光学字符识别)系统的性能。…...
【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
KEGG注释脚本kofam2kegg.py--脚本010
采用kofam结合kegg官网htxt进行注释 用法: python kofam2kegg.py kofam.out ath00001.keg my_kegg_output code: import sys from collections import defaultdictdef parse_kofam_file(kofam_file):ko_to_genes defaultdict(list)with open(kofam_file) as f:…...
spring cloud OpenFeign 详解:安装配置、客户端负载均衡、声明式调用原理及代码示例
OpenFeign 详解:安装配置、客户端负载均衡、声明式调用原理及代码示例 1. OpenFeign 安装与配置 (1) 依赖管理 <!-- pom.xml 添加以下依赖 --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud…...
【Java八股】
JVM JVM中有哪些引用 在Java中,引用(Reference)是指向对象的一个变量。Java中的引用不仅仅有常规的直接引用,还有不同类型的引用,用于控制垃圾回收(GC)的行为和优化性能。JVM中有四种引用类型…...
用 Deepseek 写的uniapp血型遗传查询工具
引言 在现代社会中,了解血型遗传规律对于优生优育、医疗健康等方面都有重要意义。本文将介绍如何使用Uniapp开发一个跨平台的血型遗传查询工具,帮助用户预测孩子可能的血型。 一、血型遗传基础知识 人类的ABO血型系统由三个等位基因决定:I…...
程序化广告行业(84/89):4A广告代理公司与行业资质解读
程序化广告行业(84/89):4A广告代理公司与行业资质解读 大家好!在探索程序化广告行业的道路上,每一次知识的分享都是我们共同进步的阶梯。一直以来,我都希望能和大家携手前行,深入了解这个充满机…...
go语言gRPC使用流程
1. 安装工具和依赖 安装 Protocol Buffers 编译器 (protoc) 下载地址:https://github.com/protocolbuffers/protobuf/releases 使用说明:https://protobuf.dev/ 【centos环境】yum方式安装:protoc[rootlocalhost demo-first]# yum install …...
【眼底辅助诊断开放平台】项目笔记
这是一个标题 任务一前端页面开发:后端接口配置: 任务二自行部署接入服务 日志修改样式和解析MD文档接入服务 Note前端登陆不进去/更改后端api接口304 Not Modifiedlogin.cache.jsonERR_CONNECTION_TIMED_OUT跨域一般提交格式proxy.ts src/coponents 目录…...
Java笔记5——面向对象(下)
目录 一、抽象类和接口 1-1、抽象类(包含抽象方法的类) 1-2、接口 编辑编辑 二、多态 编辑 1. 自动类型转换(向上转型) 示例: 注意: 2. 强制类型转换(向下转型) 示…...
NI的LABVIEW工具安装及卸载步骤说明
一.介绍 最近接到个转交的项目,项目主要作为上位机工具开发,在对接下位机时,有用到NI的labview工具。labview软件是由美国国家仪器(NI)公司研制开发的一种程序开发环境,主要用于汽车测试、数据采集、芯片测…...
[reinforcement learning] 是什么 | 应用场景 | Andrew Barto and Richard Sutton
目录 什么是强化学习? 强化学习的应用场景 广告和推荐 对话系统 强化学习的主流算法 纽约时报:Turing Award Goes to 2 Pioneers of Artificial Intelligence wiki 资料混合:youtube, wiki, github 今天下午上课刷到了不少࿰…...
css一些注意事项
css一些注意事项 .bg_ {background-image: url(/static/photo/activity_bg.png);background-size: 100% auto;background-repeat: no-repeat;background: linear-gradient(to bottom, #CADCEA, #E8F3F6);min-height: 100vh; } 背景图片路径正确但是并没有显示 // 方案1&…...
