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

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型,一个 key 对应一个 value,可以理解成与Memcached一模一样的类型。

String 类型是二进制安全的,意思是 Redis 的 String 可以包含任何数据,比如图片或者序列化的对象,一个 Redis 中字符串 value 最多可以是 512M。并且的存储是动态的(意味着可以随时修改它本身的值),每次分配内存时会高出实际字符串的 length,这样采用预分配冗余空间方式来减少内存的频繁分配。


文章目录

        • 1、String数据类型
          • 1.1、String类型简介
          • 1.2、String应用场景
        • 2、String底层结构
          • 2.1、SDS简单动态字符串结构
          • 2.2、SDS简单动态字符串优点
        • 3、String常用命令
          • 3.1、设定/获取操作
          • 3.2、自增/自减操作
          • 3.3、追加字符串
          • 3.4、删除字符串
          • 3.5、截取字符串
          • 3.6、替换字符串
          • 3.7、分布式锁设置
          • 3.8、设置过期时间
          • 3.9、批量操作设置
          • 3.10、获取字符串长度


1、String数据类型

1.1、String类型简介

String 类型是 Redis 的最基本的数据类型,一个 key 对应一个 value,可以理解成与Memcached一模一样的类型。

String 类型是二进制安全的,意思是 Redis 的 String 可以包含任何数据,比如图片或者序列化的对象,一个 Redis 中字符串 value 最多可以是 512M。并且的存储是动态的(意味着可以随时修改它本身的值),每次分配内存时会高出实际字符串的 length,这样采用预分配冗余空间方式来减少内存的频繁分配。

1.2、String应用场景

String 使用场景一般是存储简单的键值类型。比如用户信息,登录信息,配置信息等。还有一种用得比较多的是 string 的 “incr/decr” 操作,即"自减/自增"操作。调用它是原子性的,无论调用多少次,都一一计算成功,例如需要增减库存的操作。

应用场景:

  1. 缓存基础数据:例如缓存登录用户的基本的缓存数据,但是建议使用 Hash 缓存;
  2. 计数器:浏览量、点击数等。利用 string 的 “incr/decr” 操作,即"自减/自增"操作,并且它是原子性的;
  3. 限制请求次数:也是利用 “incr” 方法,以访问者的 ip 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false;
  4. 分布式共享 Session:因为 Redis 是分布式的独立服务,可以在多个应用之间共享,所以可以用作分布式 Session 等场景;
  5. 分布式锁:SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁。

2、String底层结构

2.1、SDS简单动态字符串结构

Redis 使用 SDS 简单动态字符串(Simple Dynamic String,SDS)来表示字符串,Redis 中字符串类型包含的数据结构有:整数(R_INT)、字符串(R_RAW)。

我们以字符串为例子,常规的字符串,如 “Brand”,如果要获取他的长度,需要从头开始遍历,直至遇到 ‘\0’ 空字符代表结尾,如 C 字符串:

C 字符串结构与 SDS 字符串结构对比图参照如下:

image-20230813124658755

结合上图来看,其中:

属性说明
“Free”记录 Buf 数组中未使用字节的长度
“Len”记录 Buf 数组中已使用字节的长度,等于 “Buf[]” 中字符串的长度
“Buf[]”字节数组,用于保存字符串,最后一个字节则保存了空字符 ‘\0’,代表结尾。
2.2、SDS简单动态字符串优点

比起 C 字符串,SDS 具有以下优点:

  1. 时间方面:SDS 获取字符串长度时间复杂度为 O(1) ,C 字符串不记录自身长度,获取 C 字符串长度时必须遍历整个字符串计数得到,复杂度是 O(N),SDS 字符串自身记录维护 “Len” 长度属性,获得 SDS 字符串长度的复杂度是 O(1);

  2. 空间方面-空间预分配操作:SDS 被修改后,程序不仅会为 SDS 分配所需要的空间,还会分配额外的未使用空间。这样,Redis 可以减少连续执行字符串增长操作所需的内存重分配次数;

  3. 空间方面-杜绝缓冲区溢出:C 字符串不记录长度,由于两个 C 字符串在内存存储上紧邻,在执行字符串拼接 strcat 时,如果不提前分配足够空间,很可能发生修改 s1 的数据溢出到 s2 所在的空间中(缓冲区溢出)。SDS 杜绝了缓冲区溢出问题,它记录了长度,当修改 SDS 字符串之前,API 都会检查 SDS 的空间是否满足修改的要求,不满足 API 会自动进行空间扩展;

    具体分配未使用空间如下 2 种方式:

    • 如修改后长度 “Len” 小于 1MB,就分配和 “Len” 属性相同大小的未使用空间:Free=Len

    • 如修改后长度 “Len” 大于等于 1MB,就分配 1M 的未使用空间:Free=1MB

  4. 空间方面-惰性空间的释放:SDS 避免了缩短字符串时所需的内存重分配操作,并为将来可能有的增长操作提供了优化。当 SDS 做缩短操作,不会立刻使用内存重分配来收回缩短后多出来的字节,而是保持在 free 属性里。将来如果需要 append 操作,则直接使用 “Free” 中未使用的空间,减少了内存的分配步骤。另外,SDS 也提供了 API 手动进行释放 SDS 未使用空间,避免惰性释放策略会造成内存浪费;

  5. 二进制安全:二进制安全:C 字符串的字符必须符合某种编码,除结尾空字符以外,字符串内部不允许有空字符串,存储有局限性。而在 Redis 中,不仅可以存储 String 类型的数据,也可能存储一些二进制数据。二进制数据并不是规则的字符串格式,其中会包含一些特殊的字符如 ‘\0’。在 C 中遇到 ‘\0’ 则表示字符串的结束,但 SDS 不是,它是以 “Len” 长度标识结尾;

  6. 兼容 C 字符串函数:SDS 虽然不仅二进制安全的,还是秉承 C 字符串以空字符结尾的特性,很多函数与 C 字符串一致不需要重写。


3、String常用命令

3.1、设定/获取操作

设定/获取 Key 值:

SET key value					# 设置指定 key 的值:
GET key								# 获取指定 key 的值:

image-20230819233407969

3.2、自增/自减操作

自减/自增 Key 值:

INCR key							# 自增
DECR key							# 自减

String 类型除了可以存字符串也可以是数字。注意这里得是数字才可以进行

image-20230819234729301

如果要带步长:

INCRBY key	num				# 自增
DECRBY key	num				# 自减

image-20230819234934419

3.3、追加字符串

使用 append 追加字符串:

APPEND key addvalue

append 命令后但会当前 string 长度。

image-20230819233702727

3.4、删除字符串

使用 del 删除字符串:

DEL key
DEL key1 key2 key3

image-20230819235218967

3.5、截取字符串

使用 getrange 截取字符串:

getrange key start end
getrange key 0 -1						# 查询全部

image-20230819235823254

3.6、替换字符串

使用 setrange 替换字符串::

setrange key num value

image-20230820000105855

3.7、分布式锁设置

分布锁设置,只有在 key 不存在时设置 key 的值:

SETNX key value 	

image-20230820000733308

3.8、设置过期时间

设置指定 key 的值,并将 key 的过期时间设为 seconds 秒:

SETEX key seconds value

image-20230820001035365

3.9、批量操作设置

一次性设置多个:

MSET k1 v1 k2 v2 k3 v3

一次性获取多个:

MGET k1 k2 k3

image-20230820001549588

一次性设置多个(事务),只要有一个失败,则都不成功:

MSETNX k1 v1 k2 v2 k3 v3

image-20230820001812549

3.10、获取字符串长度

使用 strlen 获取字符串长度:

STRLEN key

image-20230819234040304

相关文章:

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型,一个 key 对应一个 value,可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的,意思是 Redis 的 String 可以包含任何数据,比如图片或者序列化的对象,一个 Redi…...

React源码解析18(8)------ 实现单节点的Diff算法

摘要 经过之前的几篇文章,我们已经实现了一个可以进行更新渲染的假React。但是如果我们把我们的jsx修改成这样: function App() {const [age, setAge] useState(20)const click function() {setAge(age 1)}return age % 2 0 ? jsx("div"…...

并查集路径压缩(Java 实例代码)

目录 并查集路径压缩 Java 实例代码 UnionFind3.java 文件代码: 并查集路径压缩 并查集里的 find 函数里可以进行路径压缩,是为了更快速的查找一个点的根节点。对于一个集合树来说,它的根节点下面可以依附着许多的节点,因此&am…...

Educational Codeforces Round 153 (Rated for Div. 2)

A.我直接构造((())))和()()()这种了,因为这两种都很简便,只有()和&#xf…...

分布式 | 如何搭建 DBLE 的 JVM 指标监控系统

本篇文章采用 Docker 方式搭建 Grafana Prometheus 实现对 DBLE 的 JVM 相关指标的监控系统。 作者:文韵涵 爱可生 DBLE 团队开发成员,主要负责 DBLE 需求开发,故障排查和社区问题解答。 本文来源:原创投稿 爱可生开源社区出品&a…...

下线40万辆,欧拉汽车推出2023款好猫尊荣型和GT木兰版

欧拉汽车是中国新能源汽车制造商,成立于2018年。截至目前,已经下线了40万辆整车,可见其在市场的影响力和生产实力。为了庆祝这一里程碑,欧拉汽车推出了品牌书《欧拉将爱进行到底》,在其中讲述了欧拉汽车的发展历程和未…...

【Python】使用python解析someip报文,以someip格式打印报文

文章目录 1.安装scapy库2.解析someip格式报文3.示例 1.安装scapy库 使用 pip 安装 scapy 第三方库,打开 cmd,输入以下命令: pip install scapy出现如图所示,表示安装成功: 2.解析someip格式报文 要解析someip格式报…...

C#与西门子PLC1500的ModbusTcp服务器通信2--ModbusTcp协议

Modbus TCP是近年来越来越流行的工业控制系统通信协议之一,与其他通信协议相比,Modbus TCP通信速度快、可靠性高、兼容性强、适用于模拟或数字量信号的传输,阅读本文前你必须比较熟悉Modbus协议,了解tcp网络。 一、什么是Modbus …...

SpringBoot + MyBatis-Plus构建树形结构的几种方式

1. 树形结构 树形结构,是指:数据元素之间的关系像一颗树的数据结构。由树根延伸出多个树杈 它具有以下特点: 每个节点都只有有限个子节点或无子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点&a…...

linux vscode 下开发

linux vscode 下开发 javajdk插件查看调用层次 java jdk 各种JAVA JDK的镜像分发 编程宝库 - 技术改变世界 jdk 镜像 ubuntu22.04 安装 # Linux x64 64位 jdk-8u351-linux-x64.tar.gztar -zxf jdk-8u351-linux-x64.tar.gz mv jdk1.8.0_351 jdk8/ vim ~/.pr…...

【工具】python代码编辑器--PyCharm下载安装和介绍

PyCharm是一种Python IDE(集成开发环境),由JetBrains打造。它带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。此外,PyCharm还提供了一些高级功能,以用于支持Django框…...

SpringBoot第44讲:SpringBoot集成Redis - Redis分布式锁的实现之Jedis(setNXPX+Lua)

SpringBoot第44讲:SpringBoot集成Redis - Redis分布式锁的实现之Jedis(setNXPXLua) Redis实际使用场景最为常用的还有通过Redis实现分布式锁。本文是SpringBoot第44讲,主要介绍Redis实现分布式锁 文章目录 SpringBoot第44讲:SpringBoot集成Re…...

STM32F4X USART串口使用

STM32F4X USART串口使用 串口概念起始位波特率数据位停止位校验位串口间接线 STM32F4串口使用步骤GPIO引脚复用函数串口初始化函数串口例程 串口概念 串口是MCU与外部通信的重要通信接口,也是MCU在开发过程中的调试利器。串口通信有几个重要的参数,分别…...

python实现两个字符串比对差异点

一:代码实现 import difflib, re# 比较两个文本差异点 def compare_text_index(text1, text2):# 创建SequenceMatcher对象matcher = difflib.SequenceMatcher(a=text1, b=text2)# 获取差异报告diff_report = matcher.get_opcodes()# 检查差异报告中是否存在关键词错误for tag…...

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储,并且支持数据的增删改查操作。其中,宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能: 创建 SQLite 数据库表,用于存储宠…...

【Golang系统开发】搜索引擎(2) 压缩词典

写在前面 这篇文章我们就给出一系列的数据结构,使得词典能达到越来越高的压缩比。当然,和倒排索引记录表的大小相比,词典只占据了非常小的空间。那么为什么要对词典进行压缩呢? 这是因为决定信息检索系统的查询响应时间的一个重…...

clickhouse修改默认密码

1.明文密码 vim /etc/clickhouse-server/users.xml找到下面的语句,增加明文密码 <password>123456789</password> 2. sha256密码 # echo -n 123456789 | openssl dgst -sha256 (stdin) 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225 修改…...

基于java在线捐赠系统设计与实现

摘要 近年来&#xff0c;随着网络的快速发展&#xff0c;由于网络的开放性和便利性&#xff0c;具有广阔的发展前景。 本文设计并实现了医药捐赠系统。通过分析确定由两个不同的用户组成&#xff0c;每个用户具有不同的功能。它还可以帮助用户在线求助、申请项目、发表留言等&a…...

【前端】vscode javascript 代码片段失效问题解决

1. 文件--首选项--用户代码片段-vue.json : 添加 // { // // Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // // description. Add comma separated ids of the languages where the snippet is app…...

AE-卡通人物解说动画视频的制作

目录 1.导入卡通人物图片和音频文件 2.新建合成 3.在卡通人物图片上添加效果和表达式 4.在音频文件上添加效果和表达式 5.将卡通人物中的 CC Split2 中分割1 表达式链接到滑块中 6.卡通人物根据音频文件自动匹配口型。 AE制作卡通人物解说视频&#xff0c;卡通人物口型根据…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...