微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Redis底层分析

Redis为kv的,而Redis底层又是由c语言写成的,一切皆字典dict,和java的一切皆对象Object

Redis的key类型一般为字符串,value为redis类型RedisObject这里的kv称为dictEntry

在这里插入图片描述

相当与java中的Map<String, redisObject>

bitmap底层为String类型,hyperloglog底层为String,GEO底层为zset

1.上帝视角

在这里插入图片描述

redisServer -> redisDB -> dict -> dictht -> dictEntry -> {String, list, hash, set, zset}

从硬件,网络到数据库到内部资源表到资源表到落地是实体

2.disctEntry

上文的kv键值对,所有的key为String,所有的value为redisObject

在这里插入图片描述

3.redisObject

在这里插入图片描述

在这里插入图片描述

存在的结构体的内容为type,encoding,lru,refcount
type:string.list.set.zset.hash
encoding:当前值对象底层存储的编码类型
lru:采用lru算法清除内存的对象
refcount:记录对象引用次数

4.string的type和3大编码转换

在这里插入图片描述

这里set hello world,key为String,但是String是存储在redis自定义的sds,动态字符串中,value为保存在redisObject中

在这里插入图片描述

string的encoding:

1.int
2.raw
3.emstr

如果为数字的话encoding为int,如果不是数字的话为embstr,如果字符长度大于44的话为raw
长度0 ~ 19的话为int, 19 ~ 44 为str, >44 为raw
数字的话为int,不是数字为embstr,但是如果数字大于19 小于44的话为embstr。

全部的encoding:

在这里插入图片描述

如果命令行为set age 17的话底层的C语言:

set age 17
{
	type:string
	encoding:int
	lru
	refcount
}

5.Redis底层的数据结构

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐