Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对的时候,我们至少会创建两个对象,一个对象用作键值对的键,另外一个对象创作键值对的值。
Redis中的每个对象都由一个redisObject结构表示,该结构中保持数据有关的分别是type属性、encoding属性和prt属性。
redis场景的对象类型有以下五种:
类型常量对象的名称
string字符串对象list列表对象hashhash对象set集合对象zset有序集合对象我们可以通过type来查看一个对象的类型,但是这个命令查询的是键对象类型:
通过objectencoding命令可以查看一个数据库键的值对象的编码,对应的表如下:
对象所使用的底层数据结构objectencoding命令输出整数intembstr编码动态字符串(SDS)embstr简单动态字符串raw字典hashtable双端链表linkedlist压缩列表ziplist整数集合intset跳跃表和字典skiplist其对应关系如下
在对象中编码的转换关系如图,可以清晰的看出,哪种编码适合短数据的存储和哪些编码适合长数据的存储。
在这些数据结构中,用到的最少的就是skiplist,但是也是最经典的问题,下面结合我自己的理解来对跳跃表进行解释。
按照书上说的,跳跃表更简单的方式实现了平衡树,也就是减少了时间的复杂度,这种方式就是加上层的概念,也就是根据其内部算法生成1-32之间随机的数,但是其能够实现作用更加离不开它的有序的特点。其原理如图所示:
图中的查找明显比链表查找要少寻找了很多的节点,提高了程序的性能。
hickey