从应用到底层:36张图带你进入Redis世界(上)

本文详细介绍了Redis中的各种数据结构,如String、List、Hash、Set、ZSet、Geo、HyperLogLog、Bitmap、Bloom Filter及其底层实现。其中,String使用SDS存储,Hash基于字典实现,List使用双端链表,ZSet采用跳跃表。Redis还提供了RDB和AOF两种持久化机制,以及如何处理缓存问题,如雪崩、穿透和击穿。Redis的高性能源于其内存存储、高效数据结构和I/O多路复用模型。
摘要由CSDN通过智能技术生成

以下文章来源于sowhat1412 ,作者sowhat1412

总感觉哪里不对,但是又说不上来

1、基本类型及底层实现

编辑切换为居中

添加图片注释,不超过 140 字(可选)

1.1、String

用途:

适用于简单key-value存储、setnx key value实现分布式锁、计数器(原子性)、分布式全局唯一ID。

底层:C语言中String用char[]数组表示,源码中用SDS(simple dynamic string)封装char[],这是是Redis存储的最小单元,一个SDS最大可以存储512M信息。

 
 

struct sdshdr{ unsigned int len; // 标记char[]的长度 unsigned int free; //标记char[]中未使用的元素个数 char buf[]; // 存放元素的坑 }

Redis对SDS再次封装生成了RedisObject,核心有两个作用:

说明是5种类型哪一种。 里面有指针用来指向 SDS。

当你执行set name sowhat的时候,其实Redis会创建两个RedisObject对象,键的RedisObject 和 值的RedisOjbect 其中它们type = REDIS_STRING,而SDS分别存储的就是 name 跟 sowhat 字符串咯。

并且Redis底层对SDS有如下优化:

SDS修改后大小 > 1M时 系统会多分配空间来进行空间预分配。 SDS是惰性释放空间的,你free了空间,可是系统把数据记录下来下次想用时候可直接使用。不用新申请空间。

1.2、List

编辑切换为居中

添加图片注释,不超过 140 字(可选)

查看源码底层 adlist.h 会发现底层就是个 双端链表,该链表最大长度为2^32-1。常用就这几个组合。

lpush + lpop = stack 先进后出的栈 lpush + rpop = queue 先进先出的队列 lpush + ltrim = capped collection 有限集合 lpush + brpop = message queue 消息队列

一般可以用来做简单的消息队列,并且当数据量小的时候可能用到独有的压缩列表来提升性能。当然专业点还是要 RabbitMQ、ActiveMQ等

1.3、Hash

散列非常适用于将一些相关的数据存储在一起,比如用户的购物车。该类型在日常用途还是挺多的。

这里需要明确一点:Redis中只有一个K,一个V。其中 K 绝对是字符串对象,而 V 可以是String、List、Hash、Set、ZSet任意一种。

hash的底层主要是采用字典dict的结构,整体呈现层层封装。从小到大如下:

1.3.1、dictEntry

真正的数据节点,包括key、value 和 next 节点。

1.3.2、dictht

1、数据 dictEntry 类型的数组,每个数组的item可能都指向一个链表。 2、数组长度 size。 3、sizemask 等于 size - 1。 4、当前 dictEntry 数组中包含总共多少节点。

添加图片注释,不超过 140 字(可选)

1.3.3、dict

1、dictType 类型,包括一些自定义函数,这些函数使得key和value能够存储 2、rehashidx 其实是一个标志量,如果为-1说明当前没有扩容,如果不为 -1 则记录扩容位置。 3、dictht数组,两个Hash表。 4、iterators 记录了当前字典正在进行中的迭代器

添加图片注释,不超过 140 字(可选)

组合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值