当前位置: 首页 > news >正文

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.常用操作

创建、查询、更新、删除。

  1. 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 不存在时设置值
    在这里插入图片描述
  1. GET 读操作
    GET key
    示例:
    GET user:1 # 获取 user:1 的值
  2. MGET 读操作
    MGET key1 key2 … keyN
    示例:
    MGET user:1 user:2 user:3 # 获取多个键的值
  3. SETNX 写操作
    SETNX key value
    示例:
    SETNX user:1 “Alice” # 只有在 user:1 不存在时设置其值
  4. 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的结构,那么它是什么呢?
[图片]

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的区别吗?

  1. EMBSTR只需要一次malloc,而RAWStr需要两次,分配RedsiObject和SDS,同样前者需要一次free后者两次free。
  2. EMBSTR读取性能更好,内存碎片率更低。
  3. 如果修改EMBSTR(append操作),那么会将EMBSTR转换成RAWString(重新分配内存)。

5、SDS有什么用?

  1. 相比于普通C字符串,SDS的数据结构增加了占用大小、分配大小的元数据,提升了基于字符串进行追加,比较、复制操作的效率。
  2. 不再通过’\0’字符来判断字符串的结束,保证二进制安全,可以保存图片等二进制数据。
  3. 设计不同的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(){…...

MQ2气体传感器驱动库:原理、标定与FreeRTOS工程实践

1. MQ2气体传感器驱动库技术解析与工程实践1.1 库定位与工程价值MQ2是一款广泛应用于嵌入式系统的宽谱可燃气体检测传感器,其核心敏感元件为二氧化锡(SnO₂)半导体气敏材料。该传感器对液化石油气(LPG)、丙烷、氢气、甲…...

达梦数据库安全加固避坑指南:那些等保评测中容易忽略的配置细节(DM8实测)

达梦数据库安全加固实战:等保评测中的高阶配置陷阱与优化策略 在数据库安全领域,达梦数据库作为国产化替代的重要选择,其安全配置的严谨性直接关系到等保评测的成败。许多中高级运维人员虽然熟悉基础安全设置,却常常在等保测评的关…...

从源码到挂载:剖析NVIDIA Container Toolkit的GPU设备注入机制

1. 从零理解NVIDIA Container Toolkit的GPU挂载机制 第一次在容器里运行nvidia-smi命令时,那种"魔法般"的体验让我记忆犹新。明明宿主机上能正常使用的GPU设备,怎么在容器里就凭空出现了?这背后的秘密就藏在NVIDIA Container Toolk…...

XHS-Downloader:小红书无水印内容采集的终极解决方案

XHS-Downloader:小红书无水印内容采集的终极解决方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&…...

SITS2026发布即颠覆:大模型推理延迟降低63%、部署成本压缩41%的8项硬核工程实践

第一章:SITS2026发布:大模型工程化白皮书下载 2026奇点智能技术大会(https://ml-summit.org) 白皮书核心价值与定位 《SITS2026大模型工程化白皮书》由ML Summit联合17家头部AI基础设施厂商、云服务商及开源社区共同编制,聚焦从千卡级训练集…...

【限时解密】2026奇点大会闭门论坛纪要:头部AI实验室正秘密迁移至“神经符号视觉架构”,传统端到端VLM或于Q3被淘汰

第一章:2026奇点智能技术大会:大模型视觉理解 2026奇点智能技术大会(https://ml-summit.org) 多模态视觉理解范式的跃迁 本届大会首次系统性展示了基于世界模型(World Model)驱动的视觉理解新架构——VLM-Ω(Vision-…...

QModMaster:如何用开源Qt框架构建专业级Modbus工业通信解决方案

QModMaster:如何用开源Qt框架构建专业级Modbus工业通信解决方案 【免费下载链接】qModbusMaster Fork of QModMaster (https://sourceforge.net/p/qmodmaster/code/ci/default/tree/) 项目地址: https://gitcode.com/gh_mirrors/qm/qModbusMaster QModMaster…...

“最多跑一次”微信小程序(文档+源码)_kaic

5系统详细设计5.1前台功能模块登录,用户通过输入用户名和密码,并点击登录进行系统登录操作,如图5-1所示。图5-1用户登录界面图用户注册,在用户注册页面通过填写账号、密码、确认密码、姓名、性别、身份证、手机号码等信息进行注册…...

.NET源码生成器基于partial范式开发和nuget打包臼

1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时,OpenSpec 会提示你选择使用的 AI 工具(Claude Code、Cursor、Trae、Qoder 等)。 3 O…...

Harmonyos在语文教学中的应用-17. 会意字拆解器(对应:日月明)

17. 会意字拆解器(对应:日月明) 功能介绍: 解析《日月明》中会意字构字规律的演示工具。选择“明”字,屏幕分为两部分,左边飞入“日”,右边飞入“月”,两部分合并闪烁变为“明”。支持“森、众、尘”等字。通过动态演示,让学生明白“日+月=明”的逻辑,激发自主识字兴…...