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类型是二进制安 ...
随机推荐
- 实现StatusBar的Flat风格
效果见右图,OfficeXP里就是这样的风格,其实实现很简单,不必专门在网上找别人控件. 把StatusBar的SimplePanel设为False,点击Panels添加StatusPanel,把所有 ...
- c# in depth之泛型的类型约束详细
类型约束 1.引用类型约束 这种约束(表示成T:class,必须是为类型参数指定的第一个约束)用于确保使用的类型实参是引用类型,这可能是任何类,接口,数组,委托或者已知是引用类型的另一个类型参数. 例 ...
- 关于时间,日期,星期,月份的算法(Java中Calendar的用法)(一)
package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class Ca ...
- Android:自定义滚动边缘(EdgeEffect)效果
Android可滚动控件(GridView.ListView.ScrollView等)当用户滚动到头的时候会有个边缘反馈效果,在4.0上默认为Holo蓝色效果. 如果您的App自定义了主题颜色,比如 ...
- Photon的使用
这几个月给公司一个正在做的半吊子游戏加pvp功能,一个人居然要2个多月弄个 PVP 类似 Dota 对战的游戏.我手里有套现成搭建服务端架构都没敢用起来,这服务器还是太初步了,只是验证了 Boost ...
- 基于Adaboost的人脸检测算法
AdaBoost算法是一种自适应的Boosting算法,基本思想是选取若干弱分类器,组合成强分类器.根据人脸的灰度分布特征,AdaBoost选用了Haar特征[38].AdaBoost分类器的构造过程 ...
- Go成功的项目
nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建.packer:用来生成不同平台的镜像文件,例如V ...
- [Android学习笔记]Android中多线程开发的一些概念
线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ...
- [置顶] 初识window.location.search
window.location.search是从当前URL的?号开始的字符串 如:http://www.domain.com/item?id=0064014 它的search就是?id=0064014
- 3xx Redirection
3xx Redirection This class of status code indicates the client must take additional action to comple ...