资源描述
,数据库原理及应用,电子科技大学,-,张凤荔,数据库系统原理与开发,7.3,键值对数据库,Redis,数据库结构,Redis,数据库的实现原理,【,本节学习目标,】,一,、,Redis,的,数据库结构,存储效率(,memory)Redis,内部维护一个,db,数组,每个,db,都是一个数据库,默认,16,个数据库。用,select,命令来切换数据库。,(efficiency,)的考虑,压缩数据、减少内存碎片等问题;,快速响应时间(,fast response time,)与高吞吐量(,high throughput,)的折中方案;,单线程(,single-threaded,):简化数据结构和算法的实现,通过异步,IO,和,pipelining,等机制来实现高速的并发访问,1.,数据库数组,服务器中的数据库,,redis.h/redisServer,结构的,db,数组中,每个,redisDb,结构就代表一个数据库。,struct redisServer .,/,一个保存着,redisDb,的数组,,db,中的每一项就是一个数据库,redisDb*db;.,每个数据库由一个,redisDb,结构表示,其中,redisDb,结构中的字典,dict,保存了数据库中所有的键值对。,redisDB,结构体的定义:,typedef struct redisDb .,/,保存数据库中所有的键值对,dict*dict;.,Redis,中的字典,dict,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构,;,字典中的每个键是独一无二的,2.,字典结构,每个数据库由一个,redisDb,结构表示,其中,redisDb,结构中的字典,dict,保存了数据库中所有的键值对。,redisDB,结构体的定义:,typedef struct redisDb .,/,保存数据库中所有的键值对,dict*dict;.,Redis,中的字典,dict,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构,;,字典中的每个键是独一无二的。,typedef struct dict,dictht ht2;,int rehashidx;,int iterators;,dict,;,typedef struct dicht,dicEntry*table;,unsigned long size;,unsigned long sizemark;,unsigned long used;,dictht;,typedef struct dicEntry,void*key;/,键,union,void*val;,uint64_tu64;,int64_ts64;v;,struct dicEntry*next;,dictEntry;,字典结构图示,字典层次结构,3,Rehash,过程,过程:创建一个新的哈希表,大小是当前的两倍(准确说还必须是,2,的幂次),然后把全部键值对重新散列到新的哈希表中,最后再用它替换原来的哈希表;,rehash,问题:具体过程如下:,1).,在,ht1,上分配一个更大的哈希表;,2).“,分多次”把,ht0,上的键值对重新散列到,ht1,上;,3).,当处理完所有键值对时,让,ht0,指向新的哈希表;,4.,对象结构,redisObject,对象来表示所有的,key,和,value,。,对象结构特点,对象的编码,对象空转时长,空转时长较高的那部分键会优先被,Redis,释放,从而回收内存。,内存回收:当一个对象的引用计数为,0,时,释放该对象内存资源。,对象共享:对象的应用计数另外一个功能就是对象的共享,当一个对象被另外一个地方使用时,可以直接在该对象引用计数上,+,就行。注意:,Redis,只对包含整数值的字符串对象进行共享,二、,Redis,键值数据库的实现原理,-,原则,数据库的操作、集群的设置简单,,Redis,内部维护一个,db,数组,每个,db,都是一个数据库,默认,16,个数据库。用,select,命令来切换数据库。,存储效率(,memory efficiency,)的考虑,可压缩数据、减少内存碎片、高速缓存和外存的数据交换算法等问题;,快速响应时间(,fast response time,)与高吞吐量(,high throughput,)的折中方案;,单线程(,single-threaded,):简化数据结构和算法的实现,通过异步,IO,和,pipelining,等机制来实现高速的并发访问。,1.,键空间管理,通过字典保存了数据库中的所有键值对,字典称为键空间。,键空间的每个键都是一个字符串对象,键空间的值也就是数据库的值,可以是字符串对象,列表对象,哈希表对象,集合对象,有序集合对象中的任何一种。,添加新键、删除键、更新键、更新键、查找键,读取一个键后,服务器会更新键的最近读取时间(,LRU,)时间,用于计算键的闲置时间。如果服务器在读取一个键时发现该键已经,2.,设置生存时间和过期时间,用,expire,命令或者,pexpire,命令可以对一个键设置生存时间,自动删除生存时间为,0,的键。四个命令,expire,pexpire,expireat,pexpireat,。,过期字典记录所有带过期时间的键,程序可以通过过期字典检查一个给定键是否过期,检查给定键是否存在有过期字典并对该键是否过期进行判断,3.,过期键删除策略,系统提供三种删除策略删除过期键。,定时删除:定时器控制。,惰性删除:当获取键时检查键是否过期,过期就删除。,定期删除:每隔一段时间,程序就对数据库进行一次检查,删除过期键,4.,复制功能,Redis,复制主要包括,RDB,复制和,AOF,复制,,RDB,快照方式,,AOF,通过将发送到服务器的写操作命令记录下来,形成,AOF,文件。,在,RDB,复制中,每次执行特定的命令(,SAVE,或,BGSAVE,)时创建一个新的,RDB,文件时,过期的键不保存到新创建的,RDB,文件中。载入时,过期键就不载入。,当使用,AOF,,过期键删除之后,程序会向,AOF,文件追加一条删除命令,Redis,总结,Redis,数据库结构,-5,中数据结构,Redis,数据库的实现原理,-,字典结构,对象架构,复制规则,过期规则等,本节学习结束!,
展开阅读全文