应用高级数据结构优化Redis

         key-value缓存和存储系统通常用于互联网产品的开发中,作为后端磁盘存储系统的缓存,或记录和处理庞大的用户日志。Redis是一个高性能的key-value存储系统,可以存储多种数据类型,如string, hash, list, set, bitmap, hyperloglog等。Redis的数据缓存在内存中,极大地提高了数据库的读写效率。

         表1为Redis一些基本操作的时间复杂度,可以看出,Redis操作效率会随着数据集的增加而明显降低。因此,当数据集较为庞大时,需要从单位操作时间和内存利用率方面对数据库进行优化。下面介绍一种运用y-Fast tries优化Redis整数集操作的方法。

 

表1  Redis数据操作的时间复杂度

   Operation   

           Redis           

Insert

O(n)

Search

O(logn)

Remove

O(n)

 

数据结构介绍:

1.     x-Fast Tires

x-Fast Tires(图1)是一个用于存储整数的线索二叉树,线索二叉树具有快速查找前驱和后继节点的特点。在该数据结构中,有效数值均存储在叶子节点中,叶子节点由一个双向链表连接。树中每一层的节点单独存储于一个hash表中,树的空间复杂度为O(nlog(U)).


图1  x-Fast Tries结构示意图(From Stanford PPT)

 

x-Fast Tries的深度为log(U),由于每层的节点都存储在hash表中,因而判断一个节点是否处于某一层中只需O(1)的时间。为了寻找到这个节点,可以在树上跨层做二分查找,因为树的深度为log(U),所以查找的时间复杂度为O(loglog(U))。依此,可以分析出x-FastTries节点操作的时间复杂度:

表2  x-Fast Tires时间复杂度

   Operation   

   Time   

   Operation   

Time

insert(x)

O(log(U))

is-empty()

O(1)

search(x)

O(1)

remove(x)

O(log(U))

succ(x)

   O(loglog(U))   

prev(x)

   O(loglog(U))   

max()

O(1)

min()

O(1)

 

由上表可以看出,insert和remove操作的效率还比较低,因此引入了y-Fast Tries.

 

2.     y-Fast Tries

Y-Fast Tries是Willard, DanE提出的一种tries,由x-Fast Tires和平衡二叉搜索树节点集组合而成(图2)。它有一个突出的特点,即能够在loglog(U)时间内完成数据库的多种操作(表3),U为整数空间的size. 当U=2^64时,loglog(U)=6,这意味着在一个64位机上,Y-Fast tries可以在6步之内完成所有操作。并且,该数据结构可以在空间复杂度为O(n)情况下完成所有操作。



图2  y-Fast Tries结构示意图 (From wikipedia)

 

表3  y-Fast Tires时间复杂度

   Operation   

Time

   Operation   

Time

insert(x)

   O(loglog(U))   

is-empty()

O(1)

search(x)

O(loglog(U))

remove(x)

   O(loglog(U))   

succ(x)

O(loglog(U))

prev(x)

O(loglog(U))

max()

O(1)

min()

O(1)

 

假设每个搜索二叉树有O(log(U))个元素,树中所有定义在有序字典上的操作均可在O(loglog(U))完成。应用时,要确保每个搜索二叉树的节点数在1/2 log(U)~ 2 log(U)之间,当小于这个数值时,合并邻居节点,大于时,则产生分裂。y-Fast Tires的设计直觉是先利用x-Fast Tries定位子树,然后在子树上的进一步数据操作可以保证在O(loglog(U))时间内完成。

在空间复杂度上,每个搜索二叉树有O(log(U))个元素,x-Fast Tries中有O(n/log(U))个元素,因此总的空间复杂度为O(n/log(U)·log(U))= O(n).

 

优化结果:

1.     测试平台

CPU:       16 x Intel(R) Xeon(R) CPU E5-2670 0 @2.60GHz

Memory:  140GB

Kernel:     Linux-3.14.3

 

2.     测试结果

在原始Redis和y-Fast Tries优化后的数据库中,整数集单次操作耗时如下图,

操作耗时为采用log尺度统计,可以看出,Y-Fast Tries优化后的操作效率明显高于原始Redis的效率,在remove操作中效果最为显著。

Redis:           

Y-Fast Tries: 


 

你可能感兴趣的:(redis,数据库,Tries,y-Fast,整数集)