redis基本数据类型和对应的底层数据结构
Redis的数据类型包含string,list,hash,set,sorted set。
在Redis中,KV对是以dictEntry的形式来存储的,dictEntry是由key(key是字符串,Redis 没有直接使用 C 的字符数组,而是存储在自定义的 SDS 中)、value(redisObject)和指针组成的。
1、不用担心内存溢出问题,如果需要会对 SDS 进行扩容。
typedef struct redisObject { // 类型:string,list,hash,set,sorted set(5种基本类型) unsigned type:4; // 不使用(对齐位) unsigned notused:2; // 编码方式 unsigned encoding:4; // LRU 时间(相对于 server.lruclock) unsigned lru:22; // 引用计数 int refcount; // 指向对象的值 void *ptr; } robj;
type表示了该对象的数据类型(即上面五个中的一个)。但为了提高存储效率与程序执行效率,每种对象的底层数据结构实现都可能不止一种。encoding就表示了对象底层所使用的编码。下面先介绍每种底层数据结构的实现,再介绍每种对象类型都用了什么底层结构并分析他们之间的关系。
Redis对象底层数据结构共八种:
编码常量 编码所对应的底层数据结构
REDIS_ENCODING_INT(long 类型的整数)
REDIS_ENCODING_EMBSTR embstr (编码的简单动态字符串)
REDIS_ENCODING_RAW (简单动态字符串)
REDIS_ENCODING_HT (字典)
REDIS_ENCODING_LINKEDLIST (双端链表)
REDIS_ENCODING_ZIPLIST (压缩列表)
REDIS_ENCODING_INTSET (整数集合)
REDIS_ENCODING_SKIPLIST (跳跃表和字典)
一、String
字符串对象的底层实现可以是int、raw、embstr。
1、int,存储 8 个字节的长整型(long,2^63-1)。
2、embstr, 代表 embstr 格式的 SDS(Simple Dynamic String 简单动态字符串),存储小于 44 个字节的字符串。