• Redis基础数据结构


    1.String(字符串)

    1.1 概述

    1. 字符串 string 是 Redis 最简单的数据结构。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。
    2. String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.

    1.2 实现方式

       String在redis内部存储默认就是一个字符串(SDS),被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

    2. List(列表)

    2.1 概述

    1. Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
    2. 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
    3. 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收.

    2.2 实现方式

      Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。

      如果再深入一点,你会发现 Redis 底层存储的还不是一个简单的 linkedlist,而是称之为快速链表 quicklist 的一个结构。

      首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。

      当数据量比较多的时候才会改成 quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间,而且会加重内存的碎片化。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next 。

      所以 Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

    2.3 常用场景

    1. 消息队列

    3. Hash

    3.1 概述  

    1. Redis hash 是一个 string 类型的 field 和 value 的映射表,hash特别适合用于存储对象。
    2. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

    3.2 实现方式

      Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。

    4. Set

    4.1 概述

    1. Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
    2. Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
    3. 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

    4.2 实现方式

      Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL

    5. Sorted Set

    5.1 概述

    1. Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
    2. 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
    3. 有序集合的成员是唯一的,但分数(score)却可以重复。
    4. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

    5.2 实现方式

      zset 可能是 Redis 提供的最为特色的数据结构,它也是在面试中面试官最爱问的数据结构。

      zset主要包含两个数据结构。

      一个是 dict(字典),key是成员,value是分值,用于支持 O(1) 复杂度的按成员取分值操作;

      一个是 skiplist(跳跃表),按分值排序成员,用于支持平均复杂度为O(log N)的按分值定位成员的操作,以及范围操作;

    6 发布订阅

    1. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
    2. Redis 客户端可以订阅任意数量的频道。
    3. 订阅频道时可以订阅指定名称的频道, 当需要新增时需手动添加订阅
    4. 订阅指定模式的频道, 当新发布了符合此模式的频道时, 会自动订阅该频道

    7. 基本数据结构的编码方式

  • 相关阅读:
    sequence——强行推式子+组合意义
    2018-2-25-git-rebase-合并多个提交
    2018-2-25-git-rebase-合并多个提交
    2019-9-2-给博客添加rss订阅
    2019-9-2-给博客添加rss订阅
    2019-10-31-Resharper-去掉注释拼写
    2019-10-31-Resharper-去掉注释拼写
    2018-8-10-win10-sdk-是否向下兼容
    2018-8-10-win10-sdk-是否向下兼容
    2019-8-15-win10-edge-打开闪退问题
  • 原文地址:https://www.cnblogs.com/virgosnail/p/9533519.html
Copyright © 2020-2023  润新知