Redis底层数据结构

K-V

k-v: dict

Key: String

value: string,hash,set,SortedSet,list…

给key求hash值,对求出的hash值求模,放入对应下标数组,

hash碰撞,采用头插法解决,

redisDB:
在这里插入图片描述

在这里插入图片描述

每一个dict有两个hashtable,实现渐进式rehash(扩容)

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Wd98JQn-1622118676408)(C:\Users\10952\AppData\Roaming\Typora\typora-user-images\image-20210527192429708.png)]

**type:**类型约束;

encoding: redis底层编码形式

int(底层优化判断),emstr(小于等于44byte时),raw(大于44byte时,原始数据类型sds)

**ptr:**真正内存中的数据

五大基本数据类型

String

SDS: Simple Dynamic String

1.二进制安全的字符串

C语言使用\0表示字符串结尾,

2.提供了内存预分配机制,避免频繁的内存分配

3.兼容C语言函数库

SDS数据结构:
redis 3.2 以前
struct sdshdr {
int len;//使用长度
int free;//剩余空间
char buf[];
};

redis3.2以后

根据数据长度,优化了sds数据结构,根据数据长度选择对应sds数据类型,节省空间。

List

List是一个有序(按加入的时序排序)的数据结构,Redis采用quicklist(双端链表)ziplist 作为List的底层实现

ziplist

在这里插入图片描述

quicklist:
在这里插入图片描述

Hash

Hash 数据结构底层实现为一个字典( dict ),也是RedisBb用来存储K-V的数据结构,当数据量比较小,或者单个元素比较小时,底层用ziplist存储,当数据大小或者元素数量超过设定值时改为hashtable存储。

Set

Set 为无序的,自动去重的集合数据类型,Set 数据结构底层实现为一个value 为 null 的 字典( dict ),当数据可以用整形表示时,Set集合将被编码为intset数据结构。两个条件任意满足时
Set将用hashtable存储数据。1, 元素个数大于 set-max-intset-entries , 2 , 元素无法用整形表示

Zset

ZSet 为有序的,自动去重的集合数据类型,ZSet 数据结构底层实现为 字典(dict) + 跳表(skiplist) ,当数据比较少时,用ziplist编码结构存储。

skiplist

在这里插入图片描述

三大特殊数据类型

BitMap

Geo

通过GeoHash算法,可以将经纬度的二维坐标变成一个可排序、可比较的的字符串编码。 在编码中的
每个字符代表一个区域,并且前面的字符是后面字符的父区域。其算法的过程如下:

根据GeoHash 来计算 纬度的 二进制编码

地球纬度区间是[-90,90], 如某纬度是39.92324,可以通过下面算法来进行维度编码:

1)区间[-90,90]进行二分为[-90,0),[0,90],称为左右区间,可以确定39.92324属于右区间[0,90],给标记为1

2)接着将区间[0,90]进行二分为 [0,45),[45,90],可以确定39.92324属于左区间 [0,45),给标记为0

3)递归上述过程39.92324总是属于某个区间[a,b]。随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167

4)如果给定的纬度(39.92324)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会
产生一个序列1011 1000 1100 0111 1001,序列的长度跟给定的区间划分次数有关。

[(C:\Users\10952\AppData\Roaming\Typora\typora-user-images\image-20210527201509857.png)]

纬度产生的编码为1011 1000 1100 0111 1001,经度产生的编码为1101 0010 1100 0100 0100。偶数位放经度,奇数位放纬度,把2串编码组合生成新串:
11100 11101 00100 01111 00000 01101 01011 00001。

最后使用用0-9、b-z(去掉a, i, l, o)这32个字母进行base32编码,首先将11100 11101 00100 01111 00000 01101 01011 00001转成十进制 28,29,4,15,0,13,11,1,十进制对应的编码就是wx4g0ec1。同理,将编码转换成经纬度的解码算法与之相反
在这里插入图片描述

HyperLogLogs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingPeppa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值