Redis常用数据类型能支持的最大长度

背景:

今天接手旧的代码时,看到redis中的一个字符串类型的key的value的长度是200M,把我吓到了,这篇文章就是整理下redis常用的结构支持的最大长度

技术细节:

1.无论哪一种redis结构,他们的key都是字符串类型,而字符串类型目前Redis支持的最大长度是512M。

2.对于Set,List,Hash等Redis结构,他们可以容纳的最大元素个数是2^32-1个,也就是大概42亿个,每个元素支持的最大长度是512M

疑问:为什么字符串类型的长度最大只能支持512M?

struct sdshdr {

// buf 已占用长度
int len;

// buf 剩余可用长度
int free;

// 实际保存字符串数据的地方
char buf[];

};

其实从Redis内部保存字符串的结构上来说,并没有限定只能存储512M的字节长度,参见大神的解释:https://github.com/redis/redis/issues/757,
最大的问题是在于增加到更大长度后每个字符串都要新增8个字节的长度来保存,会导致redis内存占用增大,以及Dump等命令的原子性问题.

此外,对于位操作来说,由于512MB正好对应着32位整数的bit位,对bit位进行与或非操作时只需要一条命令即可,所以约束value的最大长度是512MB也是为了bit操作的性能起见

你可能感兴趣的:(redis,redis,缓存,数据库)