扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Redis的key和value的基础数据类型都是字符串类型。这种字符串类型是一种自定义的数据类型,simple dynamic string (SDS)。
注:
type country查看的是country(key)对应的value的类型为string类型,是Redis的五种类型,String,List,Hash,Set,ZSet等
object encoding country查看的是country(key)对应的value的内存种存储的类型为embsrt,即SDS
type age查看的是age(key)对应的value的类型是string类型,String,List,Hash,Set,ZSet等
object encoding age查看的是age(key)对应的value的存储类型为int型
Redis字符串并不全都是SDS,也有可能出现C语言的字符串(Redis是由标准C开发)。C字符串只有可能出现在字符串“字面常量种”,并且该字符串不能变更。例如:
(1)get命令返回的字符串
(2)设置日志时的字符串
Redislog(REDIS_WRINNING,"SDFSDFSDF");
1.2 SDS结构
SDS是一个结构体,定义在Redis安装目录下的src/sds.h中
而C字符串使用len+1长度的字符数组来表示实际长度为len的字符串,字符数组最后以’\0’结尾,但不能满足Redis对于字符串功能性,安全性及高效性的要求。
通过len字段得到字符串实际长度,而无需遍历整个字符串
2.2保障二进制安全SDS不以’\0’作为结束,可以保存图像,音视频等数据中存在’\0’的情况。而对于C语言的字符串,需要对数据进行限制,或者替换’\0’
2.3减少内存再分配次数对于C语言字符串来说,将两个字符数组拼接(strcat(s1,s2))时需要重新分配足够多的新内存,这导致了性能的消耗.
SDS采用了空间预分配策略与惰性空间释放策略来避免内存再分配问题
空间预分配策略:
每次SDS进行空间扩展时,程序不但为其分配所需的空间,还会为其分配额外的未使用的空间,减少内存的再分配次数,而额外分配的未使用空间大小取决于空间扩展后SDS的len属性值
1)如果需要分配的额外空间小于1M,则分配未使用的空间大小与len长度相同
2)如果需要分配的额外空间大于1M,则分配的未使用空间大小固定未1M
惰性空间释放策略:
SDS字符串长度如果缩短,那么多出来的未使用空间将暂时不释放,而是增加到free额外空间中 ,以使后期扩展SDS时减少内存再分配次数
Redis中提供了很多的SDS的API,同时为了兼容C函数,SDS的底层数据buf[]中的字符串仍然以空字符串’\0’结尾
注:比较双方一个是SDS,一个是C字符串,此时可以通过C语言函数
strcmp(sds_str->buf, c_str)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流