Redis笔记之基本数据结构 动态字符串SDS

简单动态字符串

传统上的C语言的字符串表示是以空字符结尾的字符数组(C字符串),redis自己实现一个动态字符串(SDS),两者之间的区别以及使用SDS的好处有:

  • 结构不同。C字符串以空字符结尾的字符数组,而SDS表现的更为复杂,使用一个结构体来表示一个SDS,如图所示。其中,free属性表示buffer字符数组中剩余的空间,len表示已经使用的空间。另外,SDS遵守C字符串的惯例,以空字符结尾,这样就可以复用一些C字符串的API,例如打印函数等。
    SDS
  • 常数级别的读取字符串长度。C字符串每次读取length都需要遍历一次buffer数组,而SDS通过返回len属性直接得到长度。
  • 防止数据溢出。C字符串在创建时需要分配一定的空间,如果两个字符串s1,s2在内存空间紧密相连,这时对字符串s1后面添加一个字符串,而又忘记为s1重新分配足够的空间,那么s1数据将溢出到s2的空间上;而SDS通过判断free属性来判断当前空余空间是否充足来保证正确的字符串增加等。
  • 采用预空间分配和惰性空间释放减少修改字符串带来的内存重分配次数预空间分配:当对SDS修改并且free空间不足,需要进行扩展,在补充不足空间的同时也会增加free的值;如果buffer的长度小于1M,那么扩展后的buffer长度等于len+free+1byte,free=len;如果buffer长度大于等于1M,那么扩展后的buffer长度等于len+1M+1byte。惰性空间释放:当执行字符串缩减时,不用释放空间,直接将需要释放的空间纳入到free中,减少内存释放以及重分配的次数。
  • 二进制安全。C字符串只能保存文本数据,不能保存音频,图像,压缩文件等二进制文件(因为C字符串以\0结束),而SDS可以,因为SDS不是利用空字符来判断字符串结束,而是通过len属性来判断。

另外,SDS也兼容了C字符串的一些API(因为在buffer数组使用C字符串的惯例以空字符结尾),这样的好处就是redis不用自己在重新实现,可以复用一部分C字符串的API。

本文为《Redis设计与实现》阅读笔记

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

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

相关文章

扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

1. 实例的注入方式首先来看看 Spring 中的实例该如何注入,总结起来,无非三种:属性注入set 方法注入构造方法注入我们分别来看下。1.1 属性注入属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下:Service p…

Redis笔记之基本数据结构 链表

链表 链表具有空间存储不连续,增删节点快的优点,因此redis在列表键、发布与订阅、慢查询、监视器等使用了链表作为底层实现。由于C语言中没有内置的链表实现,因此redis自己进行了实现。 双向链表。每个listtNode都有perv和next指针&#x…

SpringCloud组件:Ribbon负载均衡策略及执行原理!

大家好,我是磊哥。今天我们来看下微服务中非常重要的一个组件:Ribbon。它作为负载均衡器在分布式网络中扮演着非常重要的角色。本篇主要内容如下:在介绍 Ribbon 之前,不得不说下负载均衡这个比较偏僻的名词。为什么说它偏僻了&…

Redis笔记之基本数据结构 字典

字典 符号表、关联数组或者映射,有点类似于java中的map,用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述: 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点&…

【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

本文目录 前言一、编写第一个C语言程序-Hello World二、编译程序三、链接程序四、运行程序五、总结六、学习建议七、clang指令汇总回到顶部前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法。学习任何一门语言&#xff…

安卓平板体验Java开发,还能白嫖一年阿里无影云,真香!(内含白嫖方法,人人可领)...

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)阿里无影云早有耳闻,前两天看朋友发体验照片,可能是程序员天生爱折腾的特性又发挥作用了&#xff0c…

你知道group by的工作原理和优化思路吗?

前言 日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?本文将跟大家…

关Jquery判断input type=checkbox元素是否被选中的判断

2019独角兽企业重金招聘Python工程师标准>>> 在用到复选框的时候&#xff0c;想在js中判断chekbox是否被选中 <input name"isPermit" id"isPermit" type"checkbox"> 百度了很多的判断方法 1、 if($("#isPermit").att…

Redis夺命十二问,你能扛到第几问?

Redis是面试中绕不过的槛&#xff0c;只要在简历中写了用过Redis&#xff0c;肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入&#xff0c;全面考察候选人对于Redis的掌握情况。小张&#xff1a;面试官&#xff0c;你好。我是来参加面试的。面试官…

bzoj 1192

http://www.lydsy.com/JudgeOnline/problem.php?id1192 好像学过一个东西&#xff1a; [0..2^(N1)-1]内的数都的都可以由2^0,2^1,...,2^N这N1个数中若干个相加得到。 #include<cstdio> #include<cstdlib> #include<iostream> #include<fstream> #incl…

Spring Boot Admin 报警提醒和登录验证功能实现!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Spring Boot Admin&#xff08;SBA&#xff09;是一个开源的社区项目&#xff0c;用于管理和监控 Spring Boot 应用程序&…

企业Shell面试题18:单词及字母去重排序案例

1、按单词出现频率降序排序&#xff01; 2、按字母出现频率降序排序&#xff01; the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more inf…

5种高大上的yml读取方式,你知道几种?

我们今天就来点实战&#xff0c;总结一下除了烂大街的Value和ConfigurationProperties外&#xff0c;还有哪些读取yml配置文件的方法&#xff1f;1、Environment在Spring中有一个类Environment&#xff0c;它可以被认为是当前应用程序正在运行的环境&#xff0c;它继承了Proper…

为什么ConcurrentHashMap不允许插入null值?

作者&#xff1a;磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 语言中&#xff0c;ConcurrentHashMap 和 Hashtable 这些线程安全的集合是不允许 key 或 value 插…

.NET APlayer播放器 demo

工作需要,想开发一款播放器,当无意间浏览到APlayer的时候大爱啊,有木有迅速投入精力,在APlayer论坛看大牛们的作品及经验,看SDK中提供的chm电子书最后看了博客园中周见智的文章(灰常好!最终作品也用的他的demo改进)先来晒一下最终的效果图片。 效果截图&#xff1a;1.初始界面。…

Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分&#xff0c;它提供了两个重要的功能&#xff1a;服务注册与发现和统一…

加分进了字节,MySQL真yyds!

Java研发工程师必备技能非MySQL莫属&#xff0c;虽说易学好上手&#xff0c;但应对大厂面试&#xff0c;最容易遭遇滑铁卢、功败垂成的也是它。上手简单&#xff0c;玩转难&#xff0c;才是这款开源数据库叱咤业界多年的真实写照。MySQL 8.0正式版的到来&#xff0c;在性能和速…

Nacos服务注册与发现的2种实现方法!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Spring Cloud Alibaba 技术体系中的 Nacos&#xff0c;提供了两个重要的功能&#xff1a;注册中心&#xff08;服务注册与发…

面试必备:Spring 面试 63 问!

作者 | 夏目blog.csdn.net/wuzhiwei549/article/details/122324261Sping原理Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack&#xff0…

为什么HashMap会产生死循环?

作者&#xff1a;磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;面试合集&#xff1a;https://gitee.com/mydb/interviewHashMap 死循环是一个比较常见、比较经典的问题&am…