String【Redis对象篇】
🏆 作者简介:席万里
⚡ 个人网站:https://dahua.bloggo.chat/
✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。
🍻 对计算机充满兴趣,愿意并且希望学习更多的技术,接触更多的大神,提高自己的编程思维和解决问题的能力。
文章目录
- String
- 1.String是什么?
- 2.String怎么用?
- 3.常用操作
- 4.底层实现?
- 5.总结(重点)
String
1.String是什么?
String就是字符串,最大为512MB。
2.String怎么用?
适用存储字节数据、文本数据、序列化后的对象数据等。
缓存场景,Value存Json字符串等信息。
计数场景,因为Redis处理命令是单线程,所以执行命令的过程时原子的。因此String数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等。
3.常用操作
创建、查询、更新、删除。
- SET 写操作(创建、更新)
SET key value [EX seconds] [PX milliseconds] [NX|XX]
参数:
- EX second:设置键的过期时间为多少秒。
- PX millisecond:设置键的过期时间为多少毫秒。
- NX:只在键不存在时,才对键进行设置操作。SET key value NX等同于SETNX key value。
- XX:只在键存在时,才对键操作。
示例:
SET user:1 “Alice” EX 60 # 设置并在 60 秒后过期
SET counter 100 NX # 仅在 counter 不存在时设置值

- GET 读操作
GET key
示例:
GET user:1 # 获取 user:1 的值 - MGET 读操作
MGET key1 key2 … keyN
示例:
MGET user:1 user:2 user:3 # 获取多个键的值 - SETNX 写操作
SETNX key value
示例:
SETNX user:1 “Alice” # 只有在 user:1 不存在时设置其值 - SETEX 写操作
SETEX key seconds value
- 设置 key 的值并设置过期时间(秒)。
示例:
SETEX session:12345 3600 “user_token” # 设置并在 3600 秒后过期
4.底层实现?
String有三种编码方式:
- INT编码:就是存一个整型,可以用long表示的整数就以这种编码存储。
- EMBSTR编码:如果字符串小于等于阈值字节,使用EMBSTR编码。
- RAW编码:如果字符串大于阈值字节,则用RAW编码。
redis3.0-4.0阈值是39字节,redis5.0是44字节。
EMBSTR和RAW都是由redisObject和SDS两个结构组成,它们的差异在于,EMBSTR下redisObject和SDS是连续的内存,RAW编码下redisObject和SDS内存是分开的。
EMBSTR优点是redisObject和SDS两个结构可以一次性分配空间,缺点在于如果重新分配空间,整体都需要再分配,所以EMBSTR设计为只读,任何写操作之后EMBSTR都会变成RAW,理念是发生过修改的字符串通常会认为是易变的。
我们注意到,EMBSTR和RAW里都有一个叫SDS的结构,那么它是什么呢?
![[图片]](https://i-blog.csdnimg.cn/direct/245d8a7110e4473197cf4d5e98ecd6f5.png)
1.增加长度字段len,快速返回长度;
2.增加空余空间alloc-len,为后续追加数据留余地;
3.不再以’\0’作为判断标准,二进制安全。
5.总结(重点)
String可以存储字符数据、文本数据、二进制数据。
1、Redis字符串是怎么实现的?
对于Redis字符串对象的创建,有三种编码方式,分别是INT、EMBSTR、RAW,当创建字符串的文本为整数的时候,就是INT编码,如果当创建的字符串大小 小于等于44字节的时候,会使用EMBSTR编码,大于44字节则是RAW编码,但是44字节这个阈值只适用于Redis3.2以及以后的版本,在3.2之前是3.9版本。
2、为什么阈值是44字节?
在Redis中是采用jemalloc作为内存分配器的,Redis以64字节为阈值区分大小字符串。Redis对象占用的内存大小由RedisObject和SDS组成,RedisObject16字节,SDS中已分配、已申请、标记三个字段固定占3个字节’\0’占一个,所以能存放的数据就是44字节。
3、你知道为什么曾经是阈值是39吗?
3.2之后的版本,SDS结构进行了拆分,EMBSTR用的是sdshdr8,总容量和已使用容量字段减少了6个字节,但由于增加了一个flags字段,所以最终节约了5个字节。
4、你知道EMBSTR和RAWEMBSTR的区别吗?
- EMBSTR只需要一次malloc,而RAWStr需要两次,分配RedsiObject和SDS,同样前者需要一次free后者两次free。
- EMBSTR读取性能更好,内存碎片率更低。
- 如果修改EMBSTR(append操作),那么会将EMBSTR转换成RAWString(重新分配内存)。
5、SDS有什么用?
- 相比于普通C字符串,SDS的数据结构增加了占用大小、分配大小的元数据,提升了基于字符串进行追加,比较、复制操作的效率。
- 不再通过’\0’字符来判断字符串的结束,保证二进制安全,可以保存图片等二进制数据。
- 设计不同的SDS类型和预留空间的元数据来节省内存。
相关文章:
String【Redis对象篇】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...
top命令和系统负载
1 top中的字段说明 top是一个实时系统监视工具,可以动态展现出 CPU 使用率、内存使用情况、进程状态等信息,注意这些显示的文本不能直接使用 > 追加到文件中。 [rootvv~]# top -bn 1 | head top - 20:08:28 up 138 days, 10:29, 4 users, load av…...
ES6 混合 ES5学习记录
基础 数组 let arr [数据1,数据2,...数组n] 使用数组 数组名[索引] 数组长度 arr.length 操作数组 arr.push() 尾部添加一个,返回新长度 arr.unshift() 头部添加一个,返回新长度 arr.pop() 删除最后一个,并返回该元素的值 shift 删除第一个单元…...
HTTP 状态码大全
常见状态码 200 OK # 客户端请求成功 400 Bad Request # 客户端请求有语法错误 不能被服务器所理解 401 Unauthorized # 请求未经授权 这个状态代码必须和WWW- Authenticate 报头域一起使用 403 Forbidden # 服务器收到请求但是拒绝提供服务 404 Not Found # 请求资源不存…...
Redis学习(13)| Redisson 看门狗机制深度解析
文章目录 摘要1. 引言2. 看门狗的工作原理2.1 自动续期2.2 防止意外释放2.3 合理配置 3. 应用场景4. 最佳实践4.1 设置合理的lockWatchdogTimeout4.2 避免死锁4.3 监控和日志 5. 实现方式6. 使用示例7. 结论 摘要 Redisson 是一个用于 Redis 的 Java 客户端,它提供…...
【开源大屏】玩转开源积木BI,从0到1设计一个大屏
积木 BI 重磅推出免费大屏设计器!功能超强大,操作超流畅,体验超酷炫。快来体验一下吧。 让我们一起来看一下如何从0到1设计一个大屏。 一、积木BI大屏介绍 积木BI可视化数据大屏 是一站式数据可视化展示平台,旨在帮助用户快速通…...
基于PCRLB的CMIMO雷达资源调度方法(MATLAB实现)
集中式多输入多输出CMIMO雷达作为一种新体制雷达,能够实现对多个目标的同时多波束探测,在多目标跟踪领域得到了广泛运用。自从2006年学者Haykin提出认知雷达理论,雷达资源分配问题就成为一个有实际应用价值的热点研究内容。本文基于目标跟踪的…...
PAT--1035 插入与归并
题目描述 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。 归并排序进行如…...
Ubuntu20.04.6编译OpenWRT23.05.5错误
在Ubuntu20.04.6编译OpenWRT23.05.5时,会出现如下提示: fatal error: asm/types.h: No such file or directory 如果我们执行如下命令: sudo ln -s /usr/include/asm-generic /usr/include/asm 此时再次编译,会有如下提示&…...
一文说清flink从编码到部署上线
引言:目前flink的文章比较多,但一般都关注某一特定方面,很少有一个文章,从一个简单的例子入手,说清楚从编码、构建、部署全流程是怎么样的。所以编写本文,自己做个记录备查同时跟大家分享一下。本文以简单的mysql cdc为例展开说明。 环境说明:MySQL:5.7;flink:1.14.0…...
【5G】5G Physical Layer物理层(一)
5G多址接入和物理层与长期演进(LTE)存在一些差异。在下行方向,5G与LTE相似,依旧采用正交频分多址(OFDMA)。而在上行方向,5G采用了OFDMA和单载波频分多址(SC-FDMA)&#x…...
GauHuman阅读笔记【3D Human Modelling】
笔记目录 1. 基本信息2. 理解(个人初步理解,随时更改)3. 精读SummaryResearch Objective(s)Background / Problem StatementMethod(s)EvaluationConclusionReferences1. 基本信息 题目:GauHuman: Articulated Gaussian Splatting from Monocular Human Videos时间:2023.12…...
qemu安装arm64架构银河麒麟
qemu虚拟化软件,可以在一个平台上模拟另一个硬件平台,可以支持多种处理器架构。 一、安装 安装教程:https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接:https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...
在Elasticsearch (ES) 中,integer 和 integer_range的区别
在Elasticsearch (ES) 中,integer 和 integer_range 是两种不同的字段类型,它们用于存储和查询不同类型的数据。 Integer: integer 类型是用于存储32位整数值的简单数据类型。这个类型的字段适合用来表示单一的整数数值,例如用户的年龄、商品的数量等。支持标准的数值操作,…...
Playwright中Page类的方法
导航和页面操作 goto(url: str, **kwargs: Any): 导航到一个URL。 reload(**kwargs: Any): 重新加载当前页面。 go_back(**kwargs: Any): 导航到会话历史记录中的前一个页面。 go_forward(**kwargs: Any): 导航到会话历史记录中的下一个页面。 set_default_navigation_tim…...
硬链接方式重建mysql大表
硬链接方式重建mysql大表 操作步骤 选择数据库 select datadir; 进入数据文件目录 cd /data/mysql/mydata/testdb 创建硬连接 ln test_trans_msg_xx.ibd test_service_trans_msg_xx.ibd.bak ll test_trans_msg_xx* 进库删除表 DROP TABLE test_trans_msg_xx; 重建表 CREATE T…...
GPIO在ZYNQ7000中的结构和相关寄存器解析
GPIO MASK DATA LSW和 MASK DATA MSW LSW和MSW分别是LSW (Least Significant Word)和MSW (Most Significant Word)。 因为DATA是u32,所以如果寄存器的基址是XGPIOPS_DATA_LSW_OFFSET,那么32位就能同时让高16位的MASK DATA MSW]31:16和 MASK DATA LSW的bit7同时为…...
Qt Xlsx安装教程
Qt Xlsx安装教程 安装perl 如果没有安装perl,请参考perl Window安装教程 下载QtXlsxWriter源码 下载地址 ming32-make编译32 lib库 C:\Qt\Qt5.12.12\5.12.12\mingw73_32>d: D:\>cd D:\Code\QtXlsxWriter-master\QtXlsxWriter-master D:\Code\QtXlsxWrit…...
Certimate自动化SSL证书部署至IIS服务器
前言:笔者上一篇内容已经部署好了Certimate开源系统,于是开始搭建部署至Linux和Windows服务器,Linux服务器十分的顺利,申请证书-部署证书很快的完成了,但是部署至Windows Server的IIS服务时,遇到一些阻碍&a…...
【中工开发者】鸿蒙商城实战项目(启动页和引导页)
创建一个空项目 先创建一个新的项目选择第一个,然后点击finish 接下来为项目写一个名字,然后点击finish。 把index页面的代码改成下面代码块的代码,就能产生下面的效果 Entry Component struct Index {build() {Column(){Blank()Column(){…...
基于 base-admin 人事管理系统开源项目学习与功能扩展实战笔记
最近跟着课程实战拆解了base-admin 人事管理系统开源项目,这是一款基于 SpringBoot 搭建的企业级后台管理平台,遵循 Apache 2.0 开源协议,非常适合 Java 后端和软件工程入门练手。项目整体采用经典三层架构,Controller、Service、…...
深入STM32以太网驱动层:DP83848 PHY芯片初始化、中断处理与lwip数据收发的HAL库实现详解
STM32与DP83848以太网驱动开发实战:从PHY初始化到lwIP协议栈深度整合 在嵌入式系统开发中,以太网通信已成为工业控制、物联网网关等场景的标配功能。本文将深入探讨基于STM32F1系列微控制器与DP83848物理层芯片的以太网驱动开发全流程,重点剖…...
嵌入式GUI设计:硬件选型与OpenGL优化实战
1. 嵌入式GUI设计的核心价值与市场驱动力在智能设备爆发的时代,嵌入式图形用户界面(GUI)已经从"锦上添花"变成了"不可或缺"的核心竞争力。我亲历过多个项目,那些仅关注硬件性能而忽视交互体验的产品ÿ…...
Axure RP实战:从页面跳转到动态交互的五大核心功能详解
1. 页面跳转:让原型"活"起来的起点 第一次用Axure RP做原型时,我最惊讶的不是它华丽的界面,而是点击一个按钮居然能跳转到另一个页面——这简直像变魔术。后来才发现,页面跳转是所有交互设计的基础,就像搭积…...
dnGrep搜索结果分析与报告生成:如何导出和分享搜索数据
dnGrep搜索结果分析与报告生成:如何导出和分享搜索数据 【免费下载链接】dnGrep Graphical GREP tool for Windows 项目地址: https://gitcode.com/gh_mirrors/dn/dnGrep dnGrep是一款强大的Windows图形化GREP搜索工具,它不仅能够快速搜索文件内容…...
Ciao TLS证书监控:如何避免SSL证书过期导致的服务中断
Ciao TLS证书监控:如何避免SSL证书过期导致的服务中断 【免费下载链接】ciao HTTP checks & tests (private & public) monitoring - check the status of your URL 项目地址: https://gitcode.com/gh_mirrors/ci/ciao 在当今数字化时代,…...
告别马赛克!用html2canvas生成高清长图,我踩过的坑和最终方案
告别马赛克!用html2canvas生成高清长图,我踩过的坑和最终方案 去年接手一个电商活动页项目时,产品经理要求在H5页面底部添加"生成分享图"功能。本以为用html2canvas这个老牌库能轻松搞定,结果生成的图片模糊得像打了马赛…...
2026年AI大模型接口中转站排行榜新鲜出炉!五大平台硬核数据对比,为开发者提供权威选型指南
发布机构:中国产业信息研究院 TechInsight AI评测实验室 发布日期:2026年3月28日 数据来源:72小时连续压测、万级QPS仿真、10万 真实请求样本、服务商后台脱敏数据 2026年,AI工业化实现全面落地,全球AI大模型接口中…...
从DES到AES:被‘遗忘’的IDEA算法,它的设计思想给现代密码学留下了什么?
从DES到AES:被遗忘的IDEA算法如何塑造现代密码学 1991年诞生的IDEA算法曾被誉为"DES的完美继任者",却在历史舞台上悄然退场。当我们在讨论AES和椭圆曲线加密时,很少有人记得这个瑞士学者设计的算法如何影响了整个加密技术发展轨迹。…...
5分钟免费解锁Photoshop AVIF插件:新一代图像压缩的终极解决方案
5分钟免费解锁Photoshop AVIF插件:新一代图像压缩的终极解决方案 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format AVIF(AV1 Image File F…...
