二、Redis五种常用数据类型-String

news/2024/10/21 11:27:48/

1、用途

  • 简单的K-V缓存
  • 计数器
  • 分布式锁
  • session共享
  • 分布式ID生成(自增)

2、底层实现结构

Redis底层是c语言实现的,但是并没有使用c的string来表示字符串,而是使用自己的简单动态字符串的抽象类型(simple dynamic string,SDS)。
SDS结构:

struct sdshdr {    // 用于记录buf数组中使用的字节的数目// 和SDS存储的字符串的长度相等  int len;    // 用于记录buf数组中没有使用的字节的数目   int free;    // 字节数组,用于储存字符串char buf[];   //buf的大小等于len+free+1,其中多余的1个字节是用来存储’\0’的。
};

使用SDS,而不使用c语言string的好处:
1、常数复杂度获取字符串长度

C语言:字符串只是简单的字符的数组,当使用strlen获取字符串的长度时,内部其实是顺序遍历数组的内容,找到’\0’对应的字符,从而计算出字符串的长度,即O(n)
SDS:只需访问SDS结构中len属性,即可得到字符串的长度。复杂度为O(1)。

2、杜绝缓冲区溢出

Redis是C语言编写的,并没有方便的数据类型进行内存的分配,必须手动进行内存的分配和释放。对于字符串的拼接和复制操作,C语言开发者需要确保目标字符串的空间足够大,不然会出现溢出情况,

当使用SDS的api修改字符串时,遵循以下规则:

1、检查字符串的大小是否满足
如果空间满足,则像C语言那样操作字符串即可,如果不满足,则拓展buf空间。
2、拓展buf空间满足一下策略:

  1. 拓展前,如果字符串长度小于1MB,那么拓展后,字符串长度为2*len+1
  2. 拓展前,如果字符传长度大于1MB,那么拓展后,字符串长度为len+1Mb+1

PS:字符串的长度最多为512M。

3、减少修改字符串带来的内存重新分配次数

Redis主要通过以下两种方式来处理内存问题
1、字符串长度增加时,进行空间预分配
2、字符串长度减少时,进行惰性释放内存
当执行字符串长度减少时,SDS并不会直接减少数据结构的长度,而是修改SDS结构中的len和free(减少len,增加free,保持字符串的总长度不变),避免内存重新分配。
SDS也提供直接释放内存的API,在需要时,可以直接调用API释放内存。

4、二进制安全

C字符串除了末尾外不能出现空字符,否则会被认为是字符串的末尾。这使得C字符串只能存储文本数据,而不能存储图像,音频等二进制数据。

SDS不需要依赖控制符,而是以len来存储数的大小。SDS所有的API都是以二进制的方式处理buf数据,且不会对数据做任何处理,写入的时候是什么样子,读取到的也是什么样的。


http://www.ppmy.cn/news/1455114.html

相关文章

ubuntu20.04通过minio配置FTP服务

项目需求:原来存储文件用的是oss服务存储的,本地minio服务。因为项目需求需要ftp服务来访问文件。查看了一下minio官网4.20版本以后的支持ftp服务。官网介绍如下: 参考文章地址如下:File Transfer Protocol (FTP/SFTP) — MinIO …

Loguru的说明书

本文是loguru的doc的阅读笔记,原文链接为:原文链接 loguru 是一个替代 Python logging 的第三方库:简单易用且功能强大。 Loguru 仅使用一个全局 logger 实例 在整个进程中,无需创建多个 logger 实例,而是使用一个预…

【C语言】高质量选择题

目录 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 题目八: 题目九: 题目十: 题目十一: 题目十二: 题目十…

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候,Richard Li曾花费“巨资”请了华为前战略专家给我们培训,讲授IPD这门课的模式都很IPD,当时完全没重视,光想着不可能靠这个能把产品做好,这样做产品必定是一批…

Java并发代码入门

Java并发代码入门 1. 第一个线程2. Java创建线程的5种方式3. 多线程优势代码4. 线程的属性5. 中断线程1. 使用自定义的变量来作为标志位2. Thread.interrupted() 或者Thread.currentThread().isInterrupted() 代替自定义标志位 6. join2.5 等待一个线程-join()A中调用B.join表示…

WordPress Automatic插件 SQL注入漏洞复现(CVE-2024-27956)

0x01 产品简介 WordPress Automatic(又称为WP Automatic)是一款流行的WordPress插件,旨在帮助网站管理员自动化内容创建和发布。该插件可以从各种来源(如RSS Feeds、社交媒体、视频网站、新闻网站等)获取内容,并将其自动发布到WordPress网站。 0x02 漏洞概述 WordPres…

论文速递 | Operations Research 3月文章合集(下)

编者按 在本系列文章中,我们梳理了运筹学顶刊Operations Research在2024年3月份发布的18篇文章的基本信息,旨在帮助读者快速洞察领域新动态。本文为第二部分。 推荐文章1 ● 题目:An Unexpected Stochastic Dominance: Pareto Distributions…

升级了项目的部署方式,坑死我了!

大家好,我是程序员鱼皮。如标题所言,最近这两天,我对我们公司部分项目的部署方式进行了改造升级。 由于部署方式的调整可能会影响到线上用户的正常访问,所以只能挑在用户少的时间(凌晨)进行调整和测试。 …