作者简介
作者:冀浩东,转转数据库存储负责人,架构师
Redis字符串(String)类型是Redis最基础的数据结构,其他数据结构是在字符串类型是的基础上构建的。
本文主要分为以下三部分:
1.字符串(String)数据结构
2.常用命令
3.总结
01
字符串数据结构
字符串(String)类型是Redis最基础的数据结构。其他数据结构是在字符串类型是的基础上构建的,Redis中字符串键值对都是由SDS(simpledynamicstring)实现的。
SDS由两部分组成:sds+sdshdr
SDS由两部分组成:sds+sdshdr
sds是一个char*,指向buf数组头部地址,buf数组是存储字符串的实际位置;
sdshdr是SDS的头部数据结构,有了头部数据结构可以提高SDS操作效率,例如获得buf数组中长度,用O(1)的复杂度就可以获取。
重点看下SDS头部的数据结构。
#defineSDS_TYPE_50#defineSDS_TYPE_81#defineSDS_TYPE_#defineSDS_TYPE_#defineSDS_TYPE_#defineSDS_TYPE_MASK7#defineSDS_TYPE_BITS3typedefchar*sds;struct__attribute__((__packed__))sdshdr5{...}struct__attribute__((__packed__))sdshdr8{uint8_tlen;uint8_talloc;unsignedcharflags;charbuf[];};struct__attribute__((__packed__))sdshdr16{...}struct__attribute__((__packed__))sdshdr32{...}struct__attribute__((__packed__))sdshdr64{uint64_tlen;uint64_talloc;unsignedcharflags;charbuf[];};
以sdshdr8和sdshdr64为例。
可以看出Redis对内存的优化做到了极致,根据要保存的字符串长度选用不同头部结构,最大化节省内存开销。
len记录当前字节数组的长度不包括\0
alloc记录了当前字节数组总共分配的内存大小,不包括\0
flags记录了当前字节数组的SDS_TYPE
buf保存了字符串真正的值以及末尾的一个\0
02
常用命令
1.创建一个键值对
命令
SETkeyvalue[EXseconds
PXmilliseconds]
redisSETname"zhangsan"OK
2.获取键值
命令
GETkey
redisGETname"zhangsan"
3.获取旧的键值并且设置新值
命令
GETSETkeyvalue
redisGETSETname"lisi""zhangsan"redisGETname"lisi"
4.批量设置键值
命令
MSETkeyvalue[keyvalue...]
redisMSETname"zhangsan"age18url"