redis_简单动态字符串
Posted 阿智 mikeve@163.com
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis_简单动态字符串相关的知识,希望对你有一定的参考价值。
在redis中,C字符串(以‘\0‘结尾的字符数组)只用在一些无需对字符串值进行修改的地方,比如打印日志。其他情况,redis使用SDS - SimpleDynamicString 简单动态字符串,来做。
比如
127.0.0.1:6379> set testKey "testValue" OK
键,是一个字符串对象,底层是一个保存着字符串"testKey"的SDS
值也是一个字符串对象,底层是一个保存着字符串"testValue"的SDS
SDS 定义
struct sdshdr { // 记录buf数组中已使用的字节数,等同于字符串长度(不包括结尾的\0) int len; // 记录buf数组中未使用的字节数 int free; // 实际保存字符串的字节数组 char buf[]; }
比如一个字符串"test":
len = 4
free = 0(这个不一定,初始时为0,后续说明)
buf[] = ‘t‘、‘e‘、‘s‘、‘t‘、‘\0‘,注意结尾与C相同,也存在‘\0‘,不记入字符串长度
这样做的特点与优势
1. 常数复杂度获取字符串长度:
- C字符串不记录长度,只能遍历,到\0得到长度,时间复杂度O(n),SDS可以直接记录len为长度,时间复杂度O(1)
2.
3.
4.
5.
6.
以上是关于redis_简单动态字符串的主要内容,如果未能解决你的问题,请参考以下文章
redis源码学习simple dynamic strings(简单动态字符串 sds)