首页 > 数据库 >redis的简单动态字符串

redis的简单动态字符串

时间:2023-03-17 20:34:14浏览次数:35  
标签:sds redis len free 字符串 长度 动态

概念

redis在c的基础上编写,但是redis的许多数据结构是不同于c的数据结构。
redis的字符串表示是利用自己构建的SDS(简单动态字符串)作为默认字符串表示的。
而c默认的字符串表示,被redis用来作为字面量的表示方法,字面量,就是字符串是固定的,不会改变的。

SDS的用处:

  • 保存动态字符串值
  • 缓冲区:AOF缓冲区、客户端状态的输入缓冲区

sds定义:

struct sdshdr {
	int len; // 已使用的buf[]长度
	int free; // 未使用的buf[]长度
	char buf[]; // 保存char字节, buf[]数组默认结尾为‘\0’,且不被记入len。
}

SDS与c字符串的区别有:

  • 获取字符串长度复杂度:
    • c需要遍历字节数组以获得字符串长度,sds只需要获取len值即可。
  • 杜绝缓冲区溢出:

    如上图所示:在内存中,紧挨着两个c字符串,当执行strcat(s1,'Cluster')时,默认s1的长度足够,那么‘Cluster’就会覆盖后面s2的内容,即“内存溢出”。
    Sds的api进行修改时,会首先检查sds的内存空间是否足够,如果不够会触发自动扩容。

sds空间策略:

空间预分配

概念:当sds的api对sds进行扩容操作时,不仅会分配所需的空间,还会为sds分配多余的空间
内容:

  • 如果sds被修改后,len的长度小于1MB,那就会为sds多分配len长度的空间,此时len=free
    举例说明:修改'hello'为'hello,redis', 修改后长度为11字节,那么就会在修改后,继续为sds分配11字节的空间,此时len = free。sds实际长度为11+11+1=23字节。
  • 如果sds被修改后,长度大于1MB,那么就会在修改后,继续为sds分配1MB的free空间。

惰性空间释放

概念:sds删除部分字符串后,不会讲空出来的空间立即删除。
内容:

  • 如图,部分空间即使存储的内容被删除也不会被立即释放,会作为free空间保留在sds中,在之后的增长操作中使用。为避免空间浪费,有api真正释放free空间。

sds二进制安全

二进制安全

概念:sds不是以'\0'作为字符串结尾,所以不用担心某些以'\0'分隔的数据格式。
内容:

  • ‘Redis Cluster’, 如果使用二进制保存,c的字符串函数只会识别Redis,而忽略后面的'Cluster', 这就导致c的字符串只能用来保存文本,而图片、视频等二进制数据无法保存。而sds的二进制安全,表示sds的buf[]能直接处理二进制数据,这也是buf[]是字节数组的原因。因为sds使用len属性而不是空字符串判断结尾。

兼容C部分函数

因为SDS字符串以'\0'结尾,所以可以兼容c的部分字符串函数。

标签:sds,redis,len,free,字符串,长度,动态
From: https://www.cnblogs.com/wz-NO1/p/17228052.html

相关文章

  • 11-列表动态渲染
    题目:请补全JavaScript代码,将预设代码中的"people"数组渲染在页面中。实现下面的列表:牛油1号20岁牛油2号21岁牛油3号19岁答案:`<script>varpeople......
  • Java中通过substring和charAt截取字符串并获取指定字符
    场景字符串类似如下现在要获取S:后面的数字9实现indedOf方法,获取某字符所在下标。flightResult.getCabinString().indexOf(flightResult.getDefaultCabin().getCabinCode())......
  • Java中将CST格式的时间字符串进行格式化
    场景Java中实现将CST格式的时间字符串按指定格式进行格式化。实现代码SimpleDateFormatdateFormat=newSimpleDateFormat("EEEMMMddHH:mm:sszzzyyyy",Locale.US);......
  • Shell截取字符串方法
    Linux的字符串截取很有用。有八种方法。假设有变量var=http://www.aaa.com/123.htm.1.#号截取,删除左边字符,保留右边字符。(非贪婪匹配)echo${var#*/}其中var是......
  • java进阶 包装类 -Integer -字符串转整数存入数组案例 42
              packagecom.cyjt97.inGer;publicclassInGer{publicstaticvoidmain(String[]args){//手动封箱//......
  • Redis 快速实现分布式锁
    完备的分布式锁,需要支持哪些特性?   互斥性,互斥是锁的基本特征,同一时刻只能有一个线程持有锁,执行临界操作;超时释放,超时释放是锁的另一个必备特性,可以对比MySQLInn......
  • 459. 重复的子字符串
    给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。classSolution{public:voidgetnext(string&s,int*next){intj=-1;......
  • .net 连接各个数据库的ConnectionString字符串
    DataType----->ConnectionStringDataType.MySql----->DataSource=127.0.0.1;Port=3306;UserID=root;Password=root;InitialCatalog=cccddd;Charset=utf8;SslMode=none......
  • 我又和redis超时杠上了
    我又和redis超时杠上了 我又和redis超时杠上了服务监控系列文章服务监控系列视频背景经过上次redis超时排查,并联系云服务商解决之后,redis超时的现象好了一阵子,但......
  • CAD动态块怎么设置可见性?CAD动态块设置技巧
    在浩辰CAD软件中利用可见性参数,可以控制CAD动态块内部某一视图的显示与隐藏,那么,你知道CAD动态块怎么设置可见性吗?本节课程小编来给大家简单介绍一下浩辰CAD软件中设置CAD动......