GEO GEO 是用来存储并操作地理位置信息的数据类型。 随着移动互联网时代到来,LBS服务 (Location-Based Service) 愈发潮流,例如附近的建筑等。 GEO 就是为了解决 Redis 对位置信息的存储需求而诞生的。 内部实现 GEO 内部使用 Sorted Set 集合类型,使用 [GeoHash](Geohash - Wikipedia) 编码方法实现了经纬度到 Sort
BitMap BitMap 即位图,是一串连续的二进制(0或1)数组,通过偏移量(offset)定位元素,时间复杂度 O(1)。 内部实现 BitMap 本身使用 String 实现(sdshdr8)。 Redis 将String的 buf 数组每个 bit 位都利用起来,表示一个 BitMap。 需要注意 offset 从 0 开始。 > SETBIT me 10 1 0 > GET
Hash Hash 也是一个键值对模型。 key 指向 n 个键值对,这 n 个键值对的键为了区分称作 field。 内部实现 Hash 底层使用zipList或 哈希表实现。 遵循以下规则: 哈希类型元素个数小于 512 个(默认值,由 hash-max-ziplist-entries 配置更改)且所有值小于 64 字节(默认值,由 hash-max-ziplist-value 配置更改),则
List List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向列表添加元素。 List最大长度为2的32次方-1,即可以存储超过40亿元素。 > LPUSH myList 1 2 3 4 5 6 7 (integer) 7 > RPUSH myList 0 (integer) 8 > LRANGE myList 0 9 1) "7" 2) &
String String即 字符串对象,是Redis使用最多的数据类型,其使用 key-value 结构,key为唯一标识,value为存储内容。 value不仅可以是字符串,也可以是数字,包括整数或者浮点数。 value最多可以容纳的大小为512MB。 > SET name ErickRen OK > SET age 19 OK > GET name "ErickR
REDIS_HASH Hash本质上就是一个保存若干键值对的数据结构,类似于Java中的HashMap。 同样的,hash中只能存在一个独一无二的key,所有的操作都围绕key展开。 hash的最大优点在于其可以提供最佳O(1)的查询时间复杂度。 通过一段原始数据key,通过特定算法将其哈希值转化为数组下标,通过相同的算法处理相同的值可以计算相同的索引,所以只需要O(1)时间复杂度就可以查询到ke
REDIS_QUICKLIST quickList(快速列表)是Redis对List对象的一个实践。 在 Redis 3.0 之前,List 对象的底层数据结构是双向listNode或者zipList。 在 Redis 3.2 更新中,List 对象的底层改由 quickList 实现。 前文提到,zipList当元素个数比较多时,每当修改元素时,必须重新分配存储空间,对执行效率影响很大。 qui
REDIS_INTSET intSet即为:整数集合,整数集合本质上是一块连续内存空间。 编码结构 typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[]; } intset; 前两个属
REDIS_SKIPLIST skipList,即:跳表,或者叫跳跃表。skiplist的优势是能支持平均 O(logN) 复杂度的节点查找。 用一句话来说:skiplist就是一个有着索引的list。 编码结构 简单理解 简单来说,skipList有多层“索引”以加快查找速度: 其中L1、L2和L3都是一个list。 当查找8时,从L3查找到5,再从L2从5开始查找,查找到7,再L3中从7开始
REDIS_ZIPLIST zipList(压缩列表)是一种紧凑型的数据结构,占用一片连续的内存,本质上是一个字节数组。能提高CPU缓存的利用效率,并且针对不同数据结构进行不同编码,节省内存开销。 编码结构 zipList的字节数组主要由5个部分组成:zlbytes、zltail、zllen、zltail和entry。 zlbytes 记录了整个zipList占用的内存大小。 zltail 记
REDIS_LISTNODE REDIS_LISTNODE本质上与Java的LinkedList一致,NodeList即为链表,是基本的线性结构。C语言原生没有对链表的支持,Redis对链表进行了实现。 listNode typedef struct listNode { struct listNode *prev; struct listNode *next; void
REDIS_STRING(SDS) SDS全称Simple Dynamic String(简单动态字符串),是专为Redis设计的简易字符串实现。 Redis并未采用C语言传统字符串char*,而是自己设计了一套字符串实现标准。 传统字符串的缺陷 C语言字符串实际上就是一个以'\0'结尾的字符数组。 例如: char* myName = "ErickRen"; 的结构即为:
Redis数据结构分析 本篇将涉及C语言,请确保您拥有C语言相关基础与计算机底层知识 RedisObject (robj) robj是Redis对象的起点,所有的数据结构都封装到了robj之中。 其源码如下: struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS;
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号