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类型是二进制安 ...
随机推荐
- sql为数字添加千分位(也就是钱的格式)
感觉这个东西在项目中用得挺多的,之前在前台页面是用正则来处理,现在由于是数据查询,所以直接在查出数据的时候将其转为指定的千分位格式,省的前台再处理,不讲原理,因为我也看不懂,不过会用就行了,在网上找了 ...
- win32 sdk绘制ListBox控件
1>产生: // HWND CreateLB(HWND parentWnd) { HWND hListBox=0; hListBox = CreateWindow("LISTBOX&q ...
- 全面解读WM_NOTIFY
VC中的消息的分类有3种:窗口消息.命令消息和控件通知消息,我们这里要谈的是最后一种:控件通知消息. 控件通知消息,是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通知父窗口.通知消息只适用于 ...
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
- 不使用webview,用手机浏览器的android app
需求:wap站在手机上以App的形式打开,但不要嵌套WebView,只能以浏览器打开 package com.gzz.whyinzi; import android.net.Uri; import a ...
- Swift - 环形进度条(UIActivityIndicatorView)的用法
Swift中,除了条形进度条外,还有环形进度条,效果图如下: 1,环形进度条的基本属性 (1)Style: Large White:比较大的白色环形进度条 White:白色环形进度条 Gray:灰色环 ...
- 序列化TList of objects(摘自danieleteti的网站)
Some weeks ago a customer asked to me if it is possibile serialize a TList of objects. “Hey, you sho ...
- VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal err ...
- JSP的include指令
JSP的include 指令:向当前页面中插入的一个静态文件的内容. 在test5.jsp里面 <%@ include file="test5_1.jsp" %> 新建 ...
- (萌O(∩_∩)O)哈希知识点小结
噶呜~先来了解一下什么是哈希吧? 当我们要在一堆东西中找到想要的那一个东西,我们常常通过比较来找,理想的情况是不经过任何比较,一次就能找到,怎么才能做到这样呢?那就在记录的储存位置和他的关键字之间建立 ...