数据结构论坛

首页 » 分类 » 分类 » Redis数据结构之字符串Stri
TUhjnbcbe - 2021/8/13 21:03:00
长沙白癜风医院 http://pf.39.net/bdfyy/zjdy/171025/5789675.html

作者简介

作者:冀浩东,转转数据库存储负责人,架构师

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"

1
查看完整版本: Redis数据结构之字符串Stri