Redis学习【4】之简单动态字符串

news2025/2/21 1:09:23

文章目录

  • 一 简单动态字符串 SDS
    • 1.1 SDS简介
    • 1.2 SDS结构
    • 1.3 SDS优势
      • 1.3.1 防止”字符串长度获取”性能瓶颈
      • 1.3.2 保障二进制安全
      • 1.3.3 减少内存再分配次数
      • 1.3.4 兼容C函数
    • 1.4 常用的 SDS 操作函数

一 简单动态字符串 SDS

1.1 SDS简介

  • 无论是 Redis 的 Key 还是 Value,其基础数据类型都是字符串。例如,Hash 型 Value 的field 与 value 的类型、List 型、Set 型、ZSet 型 Value 的元素的类型等都是字符串。虽然 Redis是使用标准 C 语言开发的,但并没有直接使用 C 语言中传统的字符串表示,而是**自定义了一种字符串。**这种字符串本身的结构比较简单,但功能却非常强大,称为简单动态字符串 S i m p l e D y n a m i c S t r i n g Simple Dynamic String SimpleDynamicString,简称 S D S SDS SDS
  • 注意,Redis 中的所有字符串并不都是 SDS,也会出现 C 字符串。C 字符串只会出现在字符串“字面常量”中,并且该字符串不可能发生变更。

1.2 SDS结构

  • SDS 是一个结构体,定义在 Redis 安装目录下的 1src/sds.h
  • C 字符串本身是一个以双引号括起来,以空字符’\0’结尾的字符序列。
struct sdshdr {
	// 字节数组,用于保存字符串
	char buf[];
	// buf[]中已使用字节数量,称为 SDS 的长度
	int len;
	// buf[]中尚未使用的字节数量
	int free;
}
  • 如:执行 SET country “China”命令时,键 country 与值”China”都是 SDS 类型的,只不过一个是 SDS 的变量,一个是 SDS 的字面常量。
    • “China”在内存中的结构如下:
      在这里插入图片描述
    • 结论:SDS 的 buf 值实际是一个 C 字符串,包含空字符’\0’共占 6 个字节。但 SDS 的 len 不包含空字符’\0’,还有有 3 字节未使用空间

1.3 SDS优势

1.3.1 防止”字符串长度获取”性能瓶颈

  • 对于 C 字符串,若要获取其长度,则必须要通过遍历整个字符串才可获取。对于超长字符串的遍历,会成为系统的性能瓶颈。SDS 结构体中直接就存放着字符串的长度数据,所以获取字符串长度不需要消耗的系统性能,不会成为 Redis 的性能瓶颈。

1.3.2 保障二进制安全

  • C 字符串中只能包含符合某种编码格式的字符,例如 ASCII、UTF-8 等,并且除了字符串末尾外,其它位置是不能包含空字符’\0’的,否则该字符串就会被程序误解为提前结束。而在图片、音频、视频、压缩文件、office 文件等二进制数据中常常以空字符’\0’作为分隔符。故而在 C 字符串中是不能保存像图片、音频、视频、压缩文件、office 文件等二进制数据的。
  • **SDS 不是以空字符’\0’作为字符串结束标志的,其是通过 len 属性来判断字符串是否结束的。**所以,对于程序处理 SDS 中的字符串数据,无需对数据做任何限制、过滤、假设,只需读取即可。

1.3.3 减少内存再分配次数

  • SDS 采用了空间预分配策略与惰性空间释放策略来避免内存再分配问题
  • 空间预分配策略是指,每次 SDS 进行空间扩展时,程序不但为其分配所需的空间,还会为其分配额外的未使用空间,以减少内存再分配次数。而额外分配的未使用空间大小取决于空间扩展后 SDS 的 len 属性值。
    • 如果 len 属性值小于 1M,那么分配的未使用空间 free 的大小与 len 属性值相同。
    • 如果 len 属性值大于等于 1M ,那么分配的未使用空间 free 的大小固定是 1M。
  • 惰性空间释放策略是指,SDS 字符串长度如果缩短,那么多出的未使用空间将暂时不释放,而是增加到 free 中。以使后期扩展 SDS 时减少内存再分配次数。如果要释放 SDS 的未使用空间,则可通过 sdsRemoveFreeSpace()函数来释放。

1.3.4 兼容C函数

  • Redis 中提供了很多的 SDS 的 API,以方便用户对 Redis 进行二次开发。为了能够兼容 C函数,SDS 的底层数组 buf[]中的字符串仍以空字符’\0’结尾。
    • 如:一个是 SDS,一个是 C 字符串,此时可以通过 C 语言函数
    strcmp(sds_str->buf,c_str)
    

1.4 常用的 SDS 操作函数

  • 常用的 SDS 操作函数及其功能描述
函数功能描述
sdsnew()使用指定的 C 字符串创建一个 SDS
sdsempty()创建一个不包含任何字符串数据的 SDS
sdsdup()创建一个指定 SDS 的副本
sdsfree()释放指定的 SDS
sdsclear()清空指定 SDS 的字符串内容
sdslen()获取指定 SDS 的已使用空间 len 值
sdsavail()获取指定 SDS 的未使用空间 free 值
sdsMakeRoomFor()使指定的 SDS 的 free 空间增加指定的大小
sdsRemoveFreeSpace()释放指定 SDS 的 free 空间
sdscat()将指定的 C 字符串拼接到指定 SDS 字符串末尾
sdscatsds()将指定的 SDS 的字符串拼接到另一个指定 SDS 字符串末尾
sdscpy()将指定的 C 字符串复制到指定的 SDS 中,覆盖原 SDS 字符串内容
sdsgrouzero()扩展 SDS 字符串到指定长度。这个扩展是使用空字符’\0’填充
sdsrange()截取指定 SDS 中指定范围内的字符串
sdstrim()在指定 SDS 中删除所有指定 C 字符串中出现的所有字符
sdsemp()对比两个给定的 SDS 字符串是否相同
sdstolow()将指定 SDS 字符串中的所有字母变为小写
sdstoupper()将指定 SDS 字符串中的所有字母变为大写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《系统架构设计》-01-架构和架构师概述

文章目录1. 架构的基本定义1.1 架构组成理论1.1.1 系统元素1)概念2)静态结构和动态结构1.1.2 基本系统属性1.1.3 设计和发展原则1.2 架构的决策理论1.2.1 统一软件过程(Rational Unified Process,统一软件过程)1.2.2 决…

《手把手教你》系列基础篇(七十三)-java+ selenium自动化测试-框架设计基础-TestNG实现启动不同浏览器(详解教程)

1.简介 上一篇文章中,从TestNg的特点我们知道支持变量,那么我们这一篇就通过变量参数来启动不同的浏览器进行自动化测试。那么如何实现同时启动不同的浏览器对脚本进行测试,且听我娓娓道来。 2.项目实战 2.1创建一个TestNg class 1.首先按…

深入工厂|高精密多层板是如何被智造出来的?

或许有很多人从网络上见过各种教程,告诉你单层板是什么,多层板是什么,他们该如何做出来,但是在具体制造时却全凭想象,今天,就让我们来实地看看,精密的多层板是如何被制造出来的!今天…

大数据---zookeeper集群搭建

zookeeper集群搭建 跳过安装jdk的方法就是找到安装jdk环境的虚拟机克隆 克隆之后的虚拟机根据台数直接修改ip地址,重新配置免密登录,确保每台机器能够互相连接,然后安装zookeeper 文章目录zookeeper集群搭建前期工作服务器划分修改hostname设…

【java】Spring Boot -- Spring AOP原理及简单实现

文章目录一、AOP基本概念1.1、Filter、Interceptor、AOP1.2、AOP中的一些概念1).通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理;通知类型,主要有以下几种:2).连接点(Jo…

Acwing---1246. 等差数列

等差数列1.题目2.基本思想3.代码实现1.题目 数学老师给小明出了一道等差数列求和的题目。 但是粗心的小明忘记了一部分的数列,只记得其中 N个整数。 现在给出这 N个整数,小明想知道包含这 N 个整数的最短的等差数列有几项? 输入格式 输入…

ChatGPT 接入微信,最强聊天机器人来了

最近的 ChatGPT 又再次火热起来了,各种周边工具也是层出不穷,今天我们就一起来做一个基于 ChatGPT 的微信聊天机器人,来感受 AI 世界的快乐吧~ 我们先来看几个我比较关心的问题吧 Python 语言算法 什么是 ChatGPT 人工智能会统治世界吗&a…

【Kubernetes】【二】环境搭建 环境初始化

本章节主要介绍如何搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从。 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主…

带你玩转Jetson之Deepstream简明教程(四)DeepstreamApp如何使用以及用于工程验证。

1.DeepstreamApp是什么? 如果你安装完毕deepstream整体框架,会在你的系统执行目录内有可执行文件,文件名字是deepstream-app。这是一个可执行脚本文件,通过deepstream框架中的代码在安装的时候编译后install到系统根目录内。 此脚…

家政服务小程序实战教程11-首页跳转到分类页面

小程序的分类页面,通常会以侧边栏导航显示内容,我们使用了侧边选项卡和数据列表组件实现了分类展示的功能 还有个需求是从首页点击某个分类的时候,跳转到分类页时候需要选中对应的类别 01 增加页面参数 页面如果跳转时候需要这种接收参数并实…

JAVA和Spring的SPI机制讲解

文章目录1 SPI机制讲解1.1 引言1.2 Java SPI实现1.2.1 示例说明1.2.2 相关测试1.2.3 源码分析1.3 Spring SPI1.3.1 Spring 示例1.3.2 相关测试类1.3.3 源码分析1 SPI机制讲解 1.1 引言 SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制,可以用来启…

力扣337题 打家劫舍Ⅲ Java语言版

/**每个节点都用一个长度为2的数组来表示其状态,其中dp[0]表示偷该节点所得到的最多钱币,dp[1]表示不偷该节点所得到的最多钱币*/ class Solution {public int rob(TreeNode root) {int[] robRoot robTree(root);return Math.max(robRoot[0],robRoot[1]);}public int[] robTre…

rtp协议

RTP协议 在实时音视频通话中,我们通常使用 UDP 作为传输层协议,使用 RTP 协议包荷载音视频数据,RTP(Real-time Transport Protocol)是一种在 Internet 上传输多媒体数据的应用层协议,它通常建立在 UDP 之上…

RabbitMQ学习(五):RabbitMQ持久化

一、持久化概念在上一章内容中我们已经看到了如何处理任务不丢失的情况,但是如何保障当 RabbitMQ 服务停掉后消 息生产者发送过来的消息不丢失呢?默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它将忽视队列 和消息,除非告知它不…

Python 考试练习题4

1. 将元组 (1,2,3) 和集合 {4,5,6} 合并成一个列表。 tup(1,2,3) set{4,5,6} listlist(tup)list(set) print(list) 2. 在列表 [1,2,3,4,5,6] 首尾分别添加整型元素 7 和 0。 #方法1 list[1,2,3,4,5,6] list.insert(0,7) #list.append(0) 这两种也可以 #list.insert(len(list…

PowerJob的server启动都经历了哪些?代码不多也很简单,咱们来逐一理解。

这是一篇让你受益匪浅的文章,点个关注交流一下吧~ PowerJob如何使用,官方文档已经说的很详细了,即使没学过计算机的人,按照那上面的步骤来也是可以搭建出一个可以使用的例子来,所以今天就不在这里重复前人的工作&#…

DataWhale 大数据处理技术组队学习task1

DataWhale 大数据处理技术组队学习task1 一、大数据概述 1. 大数据时代(详细内容参考参考文章) 2. 大数据的概念(又或者是特点) 4V 数据量大(Volume) 数据来源:可以是计算机、手机&#xff…

Linux 常用命令——【 2.查看程序端口占用及网络连接 netstat 命令】

文章目录1. netstat 简介2.命令格式:3. 命令参数:4. 常用命令1. netstat 简介 netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,…

ACWING寒假每日一题python

ACWING寒假每日一题 一、孤独的照片 一个点一个点的来看,比如对于GHGHG中间的G,找到他的左边的G,以及右边的G的位置,l,r分别等于1,答案就要多加上11 但是如果对于 GHHGHHG 中间的G,我们可以看到l,r等于2&a…

【计算机网络期末复习】第六章 应用层

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址: ❤️如果有收获的话,欢迎点…