数据库是一个处理数据的地方,包含了数据计算,数据存储,和数据转换等等,其中处理数据中,数据库结构和数据库库结构的种类,可以作为评判一个数据库某项指标好坏的关键。什么是一个好的数据结构,简单的说,方便数据访问,和管理的数据结构就是一个好的数据结构。
REDIS 本身虽然是一个缓存式数据库,但他在缓存式数据库中并不单纯,REDIS 本身支持很多数据库结构,通过使用不同的数据结构来简化代码提高开发的效率。
1 Strings 类型
REDIS Strings 类似是大多数存储使用的数据格式,REDIS 内部的整体的存储结构是如下图的hashmap ,内部是通过数组实现hash,每个dictEntry 是一个key value的对象,在dictEntry中包含 key 和value的指针,分别指向在其中存储的 key 和 value。
2 lists ,lists 类型用于保存插入到REDIS 中的数据的顺序,我们将其作为一种先进先出的数据存储方式。
redis list 数据结构地城采用压缩列表 ziplist 或者 linkedlist 两种数据结构进行存储,在ziplist 不满足数据存储要求的情况下,在使用linkedlist 存储。
这里列表对象所有字符串元素的长度小于64字节,列表对象保存的元素数量小于512 。在插入信息会先对这些信息进行判断,在超过这个标准后,会启用listedlist ,这里不同的是ziplist 是压缩格式,而listedlist 是双链表的格式。
3 hash ,redis 的hash 是一种数据类型,本身存储的是一组key value的值,并且
hash 作为redis 常用的数据库类型,其底层存储结构有两种实现的方式,当数据量较少的时候,会采用ziplist 来存储数据,使用这样的方式主要需要包含两个条件 哈希对象保存的键值对数量少于512 ,同时保存的键值对和值的长度要小于64个字节。
当存储的hash 值不符合这个特性的情况下,我们使用REDIS 就需要使用dict的结构了,这个结构类似与java 的hashmap,是一个无序的数据和里边表结合的方式,如上面的图中所示,存储数据的结构是dict,字典结构的数据存储方式通过哈希表算法实现,查找性能为0(1) .
哈希表主要的工作原理是将数据映射到数据组中的定义位置,通过数组的下标来访问数据,从而提高数据的查找效率。
4 集合set 数据存储结构
redis 的 set 和list 都可以存储多个字符串,list 上面说过,可以存储的值是有序的可重复的,而set 是无序的不可重复的。在使用 set 的情况下,在我们使用的过程中,也根据数据的情况划分存储的方式,在数据量少和所有的元素都是整数的情况下,使用intset 的方式来进行数据存储,而如果不满足这个条件,则使用hashtable来进行数据的存储。通过二分查找的方式来进行数据的存取。
typedef struct intset {
// 编码方式
uint32_t encoding;
// 集合包含的元素数量
uint32_t length;
// 保存元素的数组
int8_t contents[];
} intset;
5 sorted sets
sorted set 与 sets 之间最大的不同就是顺序性,其中这个结构中包含两个数据结构 dict, 和 zskiplist ,zskiplist 结构体中有四个元素,包含 头 和 尾, 整个链表的长度,以及最大的跳表的层数。
跳表产生的主要原因是,数据搜寻的效率的问题,在节点过多的情况下如果搜寻整个节点列中的靠后的节点,则是一个消耗较大的操作。为了解决这个问题,使用了跳表的方式来进行数据的查询。使用跳表的组要原因是实现的方式比较简单,不需要过多的算法代码等,在数据量不是太大的情况下,跳表的算法实现和使用的成本低效率高。同时根据在REDIS 中查找数据的通常的处理方法,一般是不使用范围查找的,而使用传统的数据库中的平衡树,或二叉树的算法,对于REDIS 中的数据查找并无好处,同时从内存占用的角度来看指针如果是传统的算法中 每个节点包含的指针数可以计算为 1/(1-p)而使用跳表的方式,则指针数可以表达为 p=1/4 相对指针数是固定的。
REDIS 数据库与传统的数据库最大的不同点是,REDIS 中的数据结构是面向,解决程序中的实际中的数据存储和数据查询,提高性能而产生的数据结构。
标签:存储,数据库,REDIS,单纯,使用,数据结构,数据 From: https://blog.51cto.com/u_14150796/6534577