数据结构与算法简记--redis常用数据类型对应的数据结构

Redis常用数据类型对应的数据结构


Redis数据库

  • Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),也被叫作非关系型数据库
  • 常用的数据类型:
    • 字符串、列表、字典、集合、有序集合。

列表(list)

  • 支持存储一组数据。两种实现方法:
    • 压缩列表(ziplist)
    • 双向循环链表
  • 压缩列表
    • 数据量比较小的时候采用压缩列表的方式实现:
      • 列表中保存的单个数据(有可能是字符串类型的)小于 64 字节;
      • 列表中数据个数少于 512 个。
    • 非基础数据结构,类似数组,通过一片连续的内存空间,来存储数据,与数组不同的是,它允许存储的数据大小不同
  • 双向循环链表

    • 数据量比较大的时候使用(不满足压缩列表的两个条件时)

    • redis的实现方式
      • 额外定义一个 list 结构体,来组织链表的首、尾指针,还有长度等信息
      • // 以下是C语言代码,因为Redis是用C语言实现的。
        typedef struct listnode {
          struct listNode *prev;
          struct listNode *next;
          void *value;
        } listNode;
        
        
        typedef struct list {
          listNode *head;
          listNode *tail;
          unsigned long len;
          // ....省略其他定义
        } list;

字典(hash)

  • 用来存储一组数据对。每个数据对又包含键值两部分。
  • 两种实现方式:
    • 刚刚讲到的压缩列表
    • 散列表
  • 散列表:
    • 散列函数:MurmurHash2这种运行速度快、随机性好的哈希算法作为哈希函数。
    • 哈希冲突: 使用链表法来解决。
    • 动态扩容、缩容:
      • 当装载因子大于 1 的时候,Redis 会触发扩容,将散列表扩大为原来大小的 2 倍左右。
      • 当装载因子小于 0.1 的时候,Redis 就会触发缩容,缩小为字典中数据个数的大约 2 倍大小。
      • 大量的数据搬移耗时问题:Redis 使用渐进式扩容缩容策略,将数据的搬移分批进行,避免了大量数据一次性搬移导致的服务停顿:

 

      • 当装载因子触达阈值之后,只申请新空间,但并不将老的数据搬移到新散列表中。
      • 当有新数据要插入时,将新数据插入新散列表中,并且从老的散列表中拿出一个数据放入到新散列表。
      • 每次插入一个数据到散列表,都重复上面的过程。经过多次插入操作之后,老的散列表中的数据就一点一点全部搬移到新散列表中了。
      • 这样没有了集中的一次性数据搬移,插入操作就都变得很快了。

 

猜你喜欢

转载自www.cnblogs.com/wod-Y/p/12202315.html