redis之String
redis之String
流殃详细介绍redis String类型
what
String是redis的基本类型之一
1 | set name shy #设置name为shy的键值对 |
why
SDS
采用sds结构来存储字符串,结果如下
redis中使用这样的sds的结构来构建字符串主要有以下几个原因:
- 当获取长度的时候,时间复杂度为0(1)
- 二进制安全,当比如用一个空字符串作为字符串中的一个特殊变量的时候,由于c中的字符串是通过\0这个空字符来区分一个字符串是否结尾的,所以它只能用于保存文本数据,而不能保存像图片、音频、视频、压缩文件这样的二进制数据
- 杜绝缓冲区溢出(sds是通过预分配策略和惰性空间释放来减少的)
- 减少修改字符串时带来的内存重分配次数(sds是通过预分配策略和惰性空间释放来减少的)
- 可以使用c语言的一些函数,因为sds字符串的也是以\0 作为结尾的,但是sds字符串是通过sds的len属性来确定这个字符串是不是结束的,c的字符串则是单一的通过\0来确认一个字符串是否结束
预分配策略
如果对SDS进行修改之后,SDS的长度(也即是len属性的值)将小于1MB,那么程序分配和len属性同样大小的未使用空间,这时SDS len属性的值将和free属性的值相同。举个例子,如果进行修改之后,SDS的len将变成13字节,那么程序也会分配13字节的未使用空间,SDS的buf数组的实际长度将变成13+13+1=27字节(额外的一字节用于保存空字符)。
如果对SDS进行修改之后,SDS的长度将大于等于1MB,那么程序会分配1MB的未使用空间。举个例子,如果进行修改之后,SDS的len将变成30MB,那么程序会分配1MB的未使用空间,SDS的buf数组的实际长度将为30MB+1MB+1byte。
惰性空间释放
惰性空间释放用于优化SDS的字符串缩短操作:当SDS的API需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而是使用free属性将这些字节的数量记录起来,并等待将来使用。
sds和c字符串的区别
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果