首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis SDS

sds(simple dynamic string) 简单动态字符串,是redis内部存储字符串类型的数据结构,是对原生c语言中char[]的扩展和封装. sdshdr数据结构(v3.0及以前) sds...是如何使用的. set命令 在执行set key redis命令时,sds存储字符串的过程 1....惰性删除,预分配空间不会被释放,除非该字符串所对应的键被删除,或者redis启动时重新载入的字符串不会预分配空间. 3. 二进制安全,sds能存储任意二进制数据,而不仅仅是可打印字符. 4....与传统的c语言字符串类型兼容. sds的缺点及优化 缺点: 1. redis的key也使用sds作为存储数据结构,但key是不会有更改操作的,这就造成了空间的浪费. 2. sds中的len,free的类型是...优化: 针对这些缺点redis在v3.2之后,对数据格式做了调整优化. 1.

38030

聊聊Redis SDS

Redis面试中经常被问到,Redis效率为什么这么快,很多同学往往回答:① Redis基于内存操作;② Redis是单线程的,采用了IO多路复用技术;③ Redis未使用C语言字符串,使用了SDS字符串...C语言字符串使用长度为n+1的字符数组来表示长度为n的字符串,并且字符数组的最后一个元素总是空字符'\0',因为这种字符串表示方式不能满足Redis对字符串在安全性、效率以及功能方面的要求,所以Redis...在Redis中,包含字符串值的键值对都是使用SDS实现的,除此之外,SDS还被用于AOF缓冲区、客户端状态的输入缓冲区。...相比较而言,Redis程序只要访问SDS的len属性就可以直接获取到字符串长度,时间复杂度为O(1),确保获取字符串长度不会成为Redis性能瓶颈,比如对字符串键反复执行strlen命令。...通过空间预分配,Redis可以减少连续执行字符串增长操作所需的内存重分配次数,通过惰性空间释放,SDS避免了缩短字符串时所需的内存重分配操作,并为将来由可能的增长操作提供了优化。

2.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    redis源码之SDS

    1:SDS介绍 我们在redis中执行命令 set key name 的时候,key和name都是字符串类型,而且字符串(string)在redis中是会经常用到的类型,那redis是如何保存字符串的呢...我们接下来往下看 众所周知,redis是c写的,在c中使用char来保存字符串,并且用\0作为字符串的结尾,但是redis不是这样保存的,redis是使用一种叫SDS的结构来保存字符串的。...结构如下(redis3.2以前) struct sdshdr{ int len; int free; char buf[]; } 那么问题来了,redis为什么 会用SDS的结构...1) 2:保证二进制的安全 因为SDS并不是以\0为结尾的标志,自然就保证了二进制的安全 3:内存管理策略(预分配内存和惰性空间释放策略) redis是一个高速的缓存数据库,需要频繁的对字符串进行操作,..._32; return SDS_TYPE_64; #else return SDS_TYPE_32; #endif }

    46540

    Redis系列——8.SDS

    01 前言 从今天开始我们就要学习redis的源码了,想想还有点小激动呢。 前方高能预警,非战斗人员迅速撤离。...又一个但是来了,redis底层是用C语言写的,如果对C语言一窍不通,那还是算了,前方等待的是一座大山。墙裂推荐去了解一下C.emmmm,幸好我会C,哈哈哈,毕竟他是开启偶代码之路的小哥哥。...02 介绍 Redis没有直接使用C语言传统的字符串来表示(以空字符串结尾的字符数组),而是自己构造了一种名为简单动态字符串SDS。 之前看的String类型的数据结构底层就是用SDS实现的。...char buf[]; //初始化sds分配的数据空间 }; 举个栗子: 我们之前设置一个名为str1的字符串,值为redis,其实他在内存上的结构大致如下: ?...buf为char[]的数组,分配了(len+1+free)个字节的长度,前len个字节保存redis这5个字符串,接下来1个字节保存了'\0',剩下的free个字节未使用。

    41020
    领券