Redis数据库底层数据结构设计
2017-09-27 21:42
471 查看
最近在读黄健宏的《Redis设计与实现》,看完了第一部分,它是采用的自底向上的介绍方法。从最底层的数据结构开始,逐个介绍所用到的数据结构,最后形成数据库。我准备做个redis的学习笔记,这里我就自顶向下整理一下。
redis是一个键值对数据库,每个数据库由一个redisDb结构表示,其中redisDb结构中的字典dict保存了数据库中所有的键值对。
redisDB结构体的定义
当我们在客户端输入
时(一般默认是在数据库0中进行,可以通过SELECT切换数据库),其实是创建了两个对象,一个是键字符串对象(因为键总是字符串对象),另一个是值字符串对象(在这里是字符串对象)。
类型type表示是上述5中对象中的哪一种,再次强调,键只能是字符串对象(REDIS_STRING)。ptr指针指向对象实现的底层数据结构,encoding表示编码,不同的编码所对应的对象实现的数据结构不同。这些底层数据结构有int, embstr, 简单的动态字符串(SDS), 字典, 双端链表,压缩列表,整数集合,跳跃表,字典等。
假如创建了一个字符串:
一个列表:
和一个哈希表:
那么数据库的redisDb的存储方式是如下图所示的:
注意dict中每个键都是一个StringObject, 键所对应的值的对象随着存储数据的不同而不同。
book这个哈希表的’name “Redis in ACtion” author “Josiah L. Carlson” publisher “Manning” ’在redisDb中是值,它自己又是个哈希的对象。它可以通过ziplist(压缩列表)来实现,又可以通过字典来实现。相当于“大字典”(键空间)中套“小字典”(哈希对象的字典实现)
对于字典的结构,SDS 的结构,压缩列表的结构,集合或者有序集合的结构将在后面整理。
服务器中的数据库
redis服务器将所有数据库保存在服务器状态redis.h/redisServer结构的db数组中,db数组中的每项都是一个redis.h/redisDb的结构体,每个redisDb结构就代表一个数据库。struct redisServer{ ... // 一个保存着redisDb的数组,db中的每一项就是一个数据库 redisDb *db; ...}
redis是一个键值对数据库,每个数据库由一个redisDb结构表示,其中redisDb结构中的字典dict保存了数据库中所有的键值对。
redisDB结构体的定义
typedef struct redisDb{ ... //保存数据库中所有的键值对 dict *dict; ...}
当我们在客户端输入
redis>SET msg "hello" OK
时(一般默认是在数据库0中进行,可以通过SELECT切换数据库),其实是创建了两个对象,一个是键字符串对象(因为键总是字符串对象),另一个是值字符串对象(在这里是字符串对象)。
Redis中的对象
在Redis中,是使用对象来表示数据库中的键和值,键总是字符串对象,而值的对象可以是字符串对象,列表对象,哈希对象,集合对象,有序集合对象5种。每个对象由一个redisObject结构表示,该结构中和保存数据有关的三个属性是type,encoding,ptr。typedef struct redisObject{ unsigned type ; unsigned encoding; void *ptr; ...}
类型type表示是上述5中对象中的哪一种,再次强调,键只能是字符串对象(REDIS_STRING)。ptr指针指向对象实现的底层数据结构,encoding表示编码,不同的编码所对应的对象实现的数据结构不同。这些底层数据结构有int, embstr, 简单的动态字符串(SDS), 字典, 双端链表,压缩列表,整数集合,跳跃表,字典等。
数据库存储方式
如前所述,Redis的每一个数据库是由一个redisDb结构表示的,redisDb结构中的dict保存了数据库中所有的键值对,每一个键是一个对象,值也是一个对象。一般将这个字典叫做键空间。假如创建了一个字符串:
redis>SET message "hello world"
一个列表:
redis>RPUSH alphabet "a" "b" "c"
和一个哈希表:
redis>HMSET book name "Redis in ACtion" author "Josiah L. Carlson" publisher "Manning"
那么数据库的redisDb的存储方式是如下图所示的:
注意dict中每个键都是一个StringObject, 键所对应的值的对象随着存储数据的不同而不同。
book这个哈希表的’name “Redis in ACtion” author “Josiah L. Carlson” publisher “Manning” ’在redisDb中是值,它自己又是个哈希的对象。它可以通过ziplist(压缩列表)来实现,又可以通过字典来实现。相当于“大字典”(键空间)中套“小字典”(哈希对象的字典实现)
对于字典的结构,SDS 的结构,压缩列表的结构,集合或者有序集合的结构将在后面整理。
相关文章推荐
- 两难的境界:不定字段数目的数据库表设计和数据结构
- [校招面试题]Redis有几种数据结构,和其他数据库的区别
- 浅谈redis数据库的键值设计
- Redis 3.0 源码解析---底层数据结构分析(1)
- 浅谈REDIS数据库的键值设计(转)
- REDIS系列之底层数据结构
- redis 底层数据结构 压缩列表 ziplist
- 浅谈Redis数据库的键值设计(转)
- Redis数据库的键值设计
- 浅谈Redis数据库的键值设计
- redis 列表的底层数据结构链表
- Redis设计与实现——数据结构(一)
- Redis设计与实现 --- 单机数据库
- 浅谈redis数据库的键值设计
- Redis底层数据结构之字典
- 不定字段数目的数据库表设计和数据结构
- 深入理解Redis:底层数据结构
- Spring-Session配置,底层数据库使用Redis或Mysql
- 浅谈redis数据库的键值设计
- SQL性能优化中的底层概念,时间复杂度,算法和数据结构,数据库组成,查询优化和表关联原理.