数据类型篇
string
介绍
string是最基本的key- value结构,key是唯一标识,value是具体的值,value其实不仅是字符串,也可以是数字(整数或浮点数),value最多可以容纳的数据长度是512M。
内部实现
string类型的底层的数据结构实现主要是int和SDS(简单动态字符串)。
SDS和我们认识的C字符串不太一样,之所以没有使用C语言的字符串表示,因为SDS相比Cd额原声字符串:
- SDS不仅可以保存文本数据,可以保存二进制数据。因为SDS使用len属性的值而不是空字符来判断字符串是否结束,并且SDS的所有API(应用程序编程接口,预定义函数)都会以处理二进制的方式来处理SDS存放在buf[]数组里的数据,所以SDS不光能存放文本数据,而且能保存图片、银屏、视频、压缩文件这样的二进制数据。
- SDS获取字符串长度的时间复杂度是O(1)。因为C语言的字符串并不记录自身长度,所以获取长度的复杂度为O(n);而SDS结构里用len属性记录了字符串长度,所以复杂度为O(1)。
- Redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。因为SDS在拼接字符串之前会检查SDS空间是否满足要求,如果空间不够会自动扩容,所以不会导致缓冲区溢出的问题。
- 字符串对象的内部编码(encoding)有3种:int、raw和embstr。
如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成long),并将字符串对象的编码设置为int。
如果字符串对象保存的是一个字符串,并且这个字符串的长度小于等于32字节(redis2.+版本),那么字符串对象将使用一个简单动态字符串SDS来保存这个字符串,并将对象的编码设置为embstr,(embstr是一块连续的内存区域,由redisObject和sdshdr组成)embstr编码是专门用于保存段字符串的一种优化编码方式,跟正常的字符编码相比,字符编码会调用两次内存分配函数来分别创建 redisObject 和 sdshdr 结构(动态字符串结构),而 embstr 编码则通过调用一次内存分配函数来分配一块连续的内存空间,空间中包含 redisObject 和 sdshdr(动态字符串)两个结构,两者在同一个内存块中。:
应用场景
缓存对象
使用string来缓存对象有两种方式:
直接缓存整个对象有两种方式:
直接缓存珍哥哥对象的JSON,命令例子:SET user:1 '{"name":"xiaolin","age":18}'。