redis的string类型
redis的string类型
流殃详细redis的数据类型
String
what
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字符串的区别
List
常用语法
在redis中可以将list玩成栈,队列,阻塞队列
list中所有的命令以l开头
1 | lpush list one #将一个或多个值插入到列表头部(左) |
why
结构
特性
- 链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)
- 表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
- 带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)
- 带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)
- 链表节点使用void*指针来保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值
Set
hash
结构
zset
bitmap
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果