在我们日常开发中如果使用redis做缓存,那么使用最多的可能为String类型,String类型使用简单而且容易理解但这只是开发方面,如果业务数据量过大使用String类型存储可行性是否还是最高,我们可以依靠在线Redis内存预估统计工具http://www.redis.cn/redis_memory/如下统计
模拟1亿个String类型的键值对,key占用4个字节value占用4个字节,仅key,value占用内存800M,那Redis的String类型需要占用多少呢?如下所示
key和value单纯的内存消耗只占据了Redis的String类型所需总内存的十分之一,也是说有十分之九是存储其它信息,那到底是什么呢?如下分析。
Redis使用的String类型底层实现就是SDS简单动态字符串,为什么Redis需要封装而不是c自带的字符串呢?
SDS底层结构从3.x到6.x版本变化挺大需要分开学习,3.x结构简单如下所示
typedef char *sds;
struct sdshdr {
// 记录buf数组已使用的长度
unsigned int len;
// 记录buf数组没有使用的长度
unsigned int free;
// 字符串保存位置
char buf[];
};
需要注意的是buf结尾是结束符''