当前位置: 首页 > 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;卡通人物口型根据…...

linux之kylin系统nginx的安装

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

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...