Redis的数据结构和对象。

一、简单动态字符串(simple dynamic string--SDS)

       Redis使用SDS表示字符串值,键值对都用SDS实现。SDS中的字符数组buf以空字符串结尾,好处是可以直接重用一部分C字符串函数库。s

       

                                   SDS的一个例子

      SDS的优势:
          1、常数复杂度获取字符串的长度,确保获取长度不会成为Redis的性能瓶颈。

          2、杜绝缓冲区溢出,SDS的空间分配策略会在执行修改之前,检查SDS的空间是否满足修改的需求,所不满足则自动拓展SDS空间。

          3、减少每次修改字符串时需要的内存重分配次数。

               SDS通过未使用空间,实现了空间预分配和惰性空间释放两种优化策略。

               (1)空间预分配:若修改后SDS长度小于1MB,则分配和len属性值大小相同的未使用空间,则buf数组的实际长度为:len+len+1;若修改后SDS长度大于等                                                  于1MB,那么程序分配1MB,buf数组实际长度为:len+1MB+1byte;

                       SDS API先检查空间是否足够,若足够直接使用free空间,不需要内存重分配。

                (2)惰性空间释放:缩短字符串时,不需要释放内存,使用free将需要释放的字节数记录下来作为未使用空间,等待将来使用。

           4、二进制安全。

                   C字符串中不能含空字符串,否则会被认为是字符串结尾,这使得C字符串只能保存文本数据,不能保存图片等二进制数据。SDS的API是二进制安全的,不                会对数据做限制。SDS使用len的值而不是空字符判断字符串是否结束。

            5、部分兼容C字符串函数。

二、链表

       Redis构建了自己的链表实现。 多态性:dup,free,match三个函数的使用。链表被广泛用于Redis各种功能,如列表键,发布和订阅,慢查询,监视器等。

        

三、字典

       Redis构建了自己的字典实现。对数据库的增,删,改,减也是构建在对字典的操作之上,哈希键。

       Redis的字典使用哈希表作为底层实现,一个哈希表由多个哈希表节点,每个哈希表节点保存了字典的一个键值对。

       3.1 哈希表(struct dictht{...})

            

       3.2 字典(struct dict{...})

              type指向dictType结构,包含了一组操作特定类型键值对的函数。

              privdata包含了传给那些特定函数的可选参数。

              ht属性包含两个dictht哈希表,一般只使用ht[0],ht[1]只会在对ht[0]哈希表进行rehash时使用。

              rehashidx 记录rehash目前的进度。

              

       3.3 哈希算法

              

猜你喜欢

转载自www.cnblogs.com/jx9527/p/12147348.html
今日推荐