redis的类型与编码:
使用redis命令查看类型和编码
type mylist//查看mylist类型,
object encoding myset//查看myset的编码,注mylist,myset是自己定义的key
简单动态字符串
简单动态字符串是redis定义的一种数据类型。在redis中包含字符串的键值对在底层都是都是SDS实现的。
首先redis使用c编写的,为什么不用c中原生字符串?
1.获取长度的复杂度高,c语言中,字符串是通过char数组实现,本身不记录自身长度,获取长度为O(n),(使用sds是O(1),保证获取字符串的工作不会成为redis的瓶颈)
2.内存分配十分繁琐,几乎每次修改字符串,程序就会重新分配内存。,(使用sds后可以减少内存重新分配次数,同时杜绝了缓冲区溢出)
3.不能保证二进制安全,c语言以空字符结尾,二进制数据中可能包含空字符。
redis3.2之前SDS结构
/*sds.h */
struct sdshdr{
unsigned int len;//已使用字节的数量
unsigned int free;//未使用的字节的数量
char buf[] ;//保存字符串的数组
};
sds一些机制:
1.sds中依然使用空字符结尾,方便重用C字符串库中的一部分函数。
2.预分配,优化增长操作,每次重新分配空间时,不仅分配所需要的空间,还会分配额外的未使用的空间,如果修改后sds小于1M,则分配未使用空间与len相同,否则分配1M未使用空间.
3.惰性释放,优化缩短操作,当释放空间时,sds不会立即重新分配,使用free属性记录。
redis3.2之前的SDS结构不足之处?
int 占据4字节,对于较小字符串来说浪费空间。
改进之后的方案:
将类型分为5种。
对uint8_t的解释:我们所看到的 uint8_t、uint16_t、uint32_t都不是新的数据类型,而是通过typedef给类型起得别名。