IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis string数据类型学习笔记 -> 正文阅读

[大数据]Redis string数据类型学习笔记


前言

???????? 最近在学习Redis相关的知识,在看Redis五种基本数据类型时,发现里边的字符串类型和以前C语言的不一样,他是Redis内部重新实现的一种数据类型--简单动态字符串(SDS)。C语言的字符串必须以‘\0’结尾,字符串的中间不能包含'\0',这些限制使得C语言字符串只能保存文本数据。二Redis的sds字符串除了C语言的文本字符串外,还可以保存图片、音频、视频、压缩文件等二进制数据。下面,我们看看这个神奇的SDS的数据结构、原理、及优点。

提示:以下是本篇文章正文内容,下面案例可供参考

一、Redis SDS是什么?

???????? simple dynamic string--简称SDS,即简单动态字符串。它可以保存C语言字符串,这种无需对字符串值进行修改的地方,如日志记录;还可以用于可修改的字符串值的情景,如Redis的数据库里包含字符串的键值对。

二、Redis SDS数据结构

本文的源码来自 redis-6.2.6\redis-6.2.6\deps\hiredis\sds.h
struct __attribute__ ((__packed__)) hisdshdr32 {
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
len属性记录的是字符串的长度,不包含结尾的‘\0’。这是为了兼容C语言字符串,可以方便的重用C语言的一些库函数。
free属性记录sds字符串中剩余的空闲空间。正是因为sds中有预留的空间,在字符串扩展操作时,不用每次都申请内存,并拷贝,提高了操作效率。
buf里是实际的字符串保存的地方,他的内存长度为len+free+1。其中有效的字符串长度为len,len之后总是接着一个'\0'。这样,buf里面是C字符串时,可以使用C的字符串库进行操作buf。

三、Redis SDS优点

1、常数复杂度获取字符串长度;

sds结构中有len属性,所以我们取字符串长度时,不需要像C语言字符串那样,需要遍历一遍字符串,才能知道字符串的长度。

2、可以防止缓冲区溢出;

sds操作字符串扩展操作时,首先会判断free属性是否足够存放新增部分字符串,如果不够,会先扩展buf的空间,然后再执行字符串的扩展操作,所以sds的字符串扩展操作不会导致缓存区溢出。而C语言在字符串扩展时,strcat并不检查目标缓存区有足够的空间,所以有缓存区溢出风险,这些风险,都需要程序员来预防。

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

sds操作字符串时,只有free空间不足时,才会触发内存重新分配,扩展内存空间。它的扩展策略是:len小于1M时,扩展的内存空间等于len+1字节;len大于1M时,扩展的内存空间是1M+1字节。通过这种策略,可以避免字符串操作是频繁的景象内存扩展操作。这是C语言字符串不具备的性能优势。

4、采用惰性空间释放;

当进行字符串收缩操作时,并不释放多余的空间,而是把多出的空间记录进free属性,避免了内存重新分配,同时新增的空间可以方便以后字符串扩展操作时使用。

5、二进制安全;

C语言字符串必须以’\0’结尾,且字符串中间位置不能含有’\0’。而sds字符串不受这些限制,因为他记录的字符串长度保存在len属性,只要是len之内的内容,都算是字符串的值,而不是字符串结束标识符。sds除了可以保存文本字符串之外,还可以保存诸如图片、音频、视频、压缩文件等二进制文件。sds使用buf来保存字节数据的,而不只是字符串数据,所以它比C字符串更强大。


总结

????????Redis中使用了大量的数据结构,除了之前介绍的跳表及本文提到的简单动态字符串之外,还有双向列表、哈希表、集合等。我们可以通过开源项目,学习到非常多的基础知识,以及这些简单数据结构如何创造出一个性能优异的软件产品。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:53:31  更:2021-12-13 12:54:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:32:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码