Redis深入之数据结构
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深入之数据结构的更多相关文章
- Redis 5种数据结构使用及注意事项
1优缺点 非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster.MongoDB那样更新同 ...
- redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
- (2)redis的基本数据结构是动态数组
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; ]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针, ...
- 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. ...
- Redis指令与数据结构(二)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
- redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合
redis 五种数据结构详解(string,list,set,zset,hash) https://www.cnblogs.com/sdgf/p/6244937.html redis 与 spring ...
- 【Redis】redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
- Redis之Hash数据结构
0.前言 redis是KV型的内存数据库, 数据库存储的核心就是Hash表, 我们执行select命令选择一个存储的db之后, 所有的操作都是以hash表为基础的, 下面会分析下redis的hash数 ...
- redis string底层数据结构sds
redis的string没有采用c语言的字符串数组而采用自定义的数据结构SDS(simple dynamic string)设计 len 为字符串的实际长度 在redis中获取字符串的key长度的时 ...
- Redis(一)、Redis五种数据结构
Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...
随机推荐
- TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景
声明如下: TCustomPanel = class(TCustomControl) private FFullRepaint: Boolean; FParentBackgroundSet: Bool ...
- uva 1374 快速幂计算
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #i ...
- IT忍者神龟之中的一个句sql语句——连接同一字段的全部值
Oracle能够用SYS_CONNECT_BY_PATH字符串聚合函数: SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(productname, ', ')), ', ') ...
- 四个机器学习一步一步入门约束波尔兹曼机RBM
- OO alv report
DATA: gr_alvgrid TYPE REF TO cl_gui_alv_grid ,"ALV对象 gt_fieldcat TYPE lvc_t_fcat , "ALV字段控 ...
- Android开发之搜Ya项目说明(3)
项目 搜芽移动client ----seller,app,base三个包的简单说明 作者 曾金龙 Tel:18664312687 QQ :470910357@qq.com 时间 2014-10-14 ...
- Ubuntu升级到14.04
公司网络实在太翔了,搞了一天最终成功把ubuntu从13.10升级到了14.10,中间也越到了非常多问题,记录下来,以备參考. 13.10的时候想体验一把搜狗输入法,结果因为fcitx版本号太低,用了 ...
- js中获取jsp中的参数
碰到一个问题需要再js中根据jsp中request的参数判断执行那段代码 第一种写法: if('${method}'=="add"){js代码段1}else{js代码段2} 第二种 ...
- c++中虚函数和纯虚函数定义
只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声 ...
- 进一步解 apt-get 的几个命令
用 apt-get 也非常久了,没多想它的实现,近期遇到 gstreamer 装不上的问题.才多看看了它 apt-get 就是从网上下载包,并安装到本地 手工下载 dpkg 包,而后 "dp ...