Redis主要数据结构

链表

Redis使用的C语言并没有内置这样的数据结构,所以Redis构建了自己的链表实现。列表键的底层实现之中的一个就是链表,一个列表键包括了数量比較多的元素,列表中包括的元素都是比較长的字符串,Redis就会使用链表作为列表键的底层实现。

除了链表键之外。Redisserver本身还使用链表来保存多个client的状态信息。使用链表来构建client输出缓冲区。

eg: redis> LLEN integers

(integer)1024

integers列表键包括了从1到1024共1024个整数,integers列表键的底层实现就是一个链表,链表中的每一个节点都保存了一个整数值。

每一个链表节点由一个listNode结构来表示,每一个节点都有一个指向前置节点和后置节点的指针。Redis的链表实现是双端链表。

每一个链表使用一个list结构来表示,这个结构带有表头节点指针、表尾节点指针,以及链表长度等。

由于链表表头节点的前置节点和表尾节点的后置节点都指向NULL,所以Redis的链表实现是无环链表。

字典

字典。符号表或映射,保存键值对的抽象数据结构

Redis构建了自己的字典。字典使用哈希表作为底层实现,每一个字典带有两个哈希表。一个平时使用,还有一个仅在进行rehash时使用。一个哈希表里面能够有多个哈希表节点。而每一个哈希表节点就保存了字典中的一个键值对。Redis使用MurmurHash2算法来计算键的哈希值。

两个或以上数量的键被分配到了哈希表数组的同一个索引上面。这些键发生了冲突。Redis的哈希表使用链地址法来解决键冲突。

随着操作的不断运行,哈希表保存的键值对会逐渐地增多或者降低。为了让哈希表的负载因子维持在一个合理的范围之内,扩展和收缩哈希表的工作能够通过运行rehash(又一次散列)操作来完毕,须要将现有哈希表包括的全部键值对rehash到新哈希表里面。而且rehash过程并非一次性完毕的,而是渐进式地完毕的。

跳跃表

跳跃表是一种有序数据结构,它通过在每一个节点中维持多个指向其他节点的指针。从而达到高速訪问节点的目的。

redis>ZRANGE fruit-price 0 2 WITHSCORES

fruit-price有序集合的全部数据都保存在一个跳跃表里面,每一个跳跃表节点都保存了一款水果的价钱信息,全部水果按价钱的高低从低到高在跳跃表里面排序。

Redis使用跳跃表作为有序集合键的底层实现之中的一个,假设一个有序集合包括的元素数量比較多。又或者有序集合中元素成员是比較长的字符串时。Redis就会使用跳跃表来作为有序集合键的底层实现。Redis仅仅在两个地方用到了跳跃表。一个是实现有序集合键。还有一个是在集群节点中用作内部数据结构。

Redis的跳跃表实现由zskiplist和zskiplistNode两个结构组成,当中zskiplist用于保存跳跃表信息(比方表头节点、表尾节点、长度)。而zskiplistNode则用于表示跳跃表节点。

整数集合

整数集合是集合键的底层实现之中的一个,当一个集合仅仅包括整数值元素,而且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

redis > SADD numbers 1 3 5 7 9

压缩列表是一种为节约内存而开发的顺序型数据结构。

redis>RPUSH 1st 1 3 5 10086 "hello" "world"

压缩列表由一系列特殊编码的连续内存块组成的顺序型数据结构。

压缩列表被用作列表键和哈希键的底层实现之中的一个

压缩列表能够包括多个节点。每一个节点能够保存一个字节数组或者整数值。

加入新节点到压缩列表,或者从压缩列表中删除节点。可能会引发连锁更新操作,但这样的操作出现的几率并不高。

Redis深入之数据结构的更多相关文章

  1. Redis 5种数据结构使用及注意事项

    1优缺点 非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster.MongoDB那样更新同 ...

  2. redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...

  3. (2)redis的基本数据结构是动态数组

    redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; ]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针, ...

  4. 2.Redis五种数据结构

    2.Redis五种数据结构2.1 预备2.1.1 全局命令2.1.2 数据结构和内部编码2.1.3 单线程架构2.2 字符串2.2.1 命令2.2.2 内部编码2.2.3 典型使用场景2.3 哈希2. ...

  5. Redis指令与数据结构(二)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  6. redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合

    redis 五种数据结构详解(string,list,set,zset,hash) https://www.cnblogs.com/sdgf/p/6244937.html redis 与 spring ...

  7. 【Redis】redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...

  8. Redis之Hash数据结构

    0.前言 redis是KV型的内存数据库, 数据库存储的核心就是Hash表, 我们执行select命令选择一个存储的db之后, 所有的操作都是以hash表为基础的, 下面会分析下redis的hash数 ...

  9. redis string底层数据结构sds

    redis的string没有采用c语言的字符串数组而采用自定义的数据结构SDS(simple dynamic string)设计 len 为字符串的实际长度  在redis中获取字符串的key长度的时 ...

  10. Redis(一)、Redis五种数据结构

    Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...

随机推荐

  1. Delphi线程池

    unit uThreadPool; {   aPool.AddRequest(TMyRequest.Create(RequestParam1, RequestParam2, ...)); } inte ...

  2. 大数据实时处理-基于Spark的大数据实时处理及应用技术培训

    随着互联网.移动互联网和物联网的发展,我们已经切实地迎来了一个大数据 的时代.大数据是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合,对大数据的分析已经成为一个非常重要且紧迫的 ...

  3. 2.4.1-Java语言基础(常量)

    2.4.1 常量 常量表示不能改变的数值. Java中常量的分类: 1,整数常量.全部整数 2,小数常量.全部小数 3,布尔型常量.较为特有,仅仅有两个数值.true false. 4,字符常量.将一 ...

  4. 移动开发中的Scheme跳转说明——Allowing OtherApps to Start Your Activity

    Allowing OtherApps to Start Your Activity 为了开发更多人使用的App,我们总希望我们的App能够提供一种接口被其他App调用.如我们常见的 大众点评  与  ...

  5. Swift - 使用UIScrollView实现页面滚动切换

    UIScrollView提供了以页面为单位滚动显示各个子页面内容的功能,每次手指滑动后会滚动一屏的内容.   要实现该功能,需要如下操作: 1,将UIScrollView的pagingEnabled属 ...

  6. C语言实现通用数据结构的高效设计

    近期在阅读一个开源的C++代码.里面用到了大量的STL里面的东西.或许是自己一直用C而非常少用C++来实现算法的原因.STL里面大量的模板令人心烦.一直对STL的效率表示怀疑,但在网上搜到这样一个帖子 ...

  7. 【MySQL案例】HA: GTID_MODE配置不一致

    1.1.1. HA: GTID_MODE配置不一致 [环境描写叙述] msyql5.6.14 [报错信息] 初始状态Master和Slave都开启了enforce-gtid-consistency和g ...

  8. Oracle的dbms_output包的put()和put_line()的区别只是有没有回车换行吗?(转)

    答案是否 除了自动添加回车换行外,还有就是缓冲区最大容量的问题!! 无论如何设置serveroutput size,10g里 put() 最多只能输出 32767 个byte 而 put_line() ...

  9. hadoop集群空间使用情况报告脚本

    近期集群空间有点紧张,总是操心空间不足而崩溃,近期扩容又不太现实,经与集群用户沟通发现:集群上存储了非常多没用的历史数据,能够删除,这样就能够通过一个crontab脚本每天生成集群空间使用报告,当使用 ...

  10. Oracle定时执行存储过程(转)

    定时执行存储过程在平时开发中经常会用到,年前的时候自己也做了一个,由于时间关系一直没能记录,现记录下来.       首先用一个完整的例子来实现定时执行存储过程. 任务目标:每小时向test表中插入一 ...