Redis内存面试与分析

分析:

首先,redisDb代表的是Redis的数据结构,我们主要关注dict这个数据结构

还有一个expires存储的是我们的过期值,这个也要记住

以下是dict:

Plain 复制代码
typedef struct dict {
    dictType *type;        // 类型相关的操作
    void *privdata;        // 额外的私有数据
    dictEntry **ht[2];     // 哈希表的两个版本(用于处理扩容)
    unsigned long size[2]; // 当前哈希表的大小
    unsigned long used[2]; // 已使用的槽数
    long rehashidx;        // 当前正在进行的扩容位置(如果有扩容)
    unsigned long iterators; // 当前正在进行的迭代器数量
} dict;

在 Redis 中有 hashset 类型的字典,每种类型的字典操作(如计算哈希值)可能不同。

以下是expire的一个数据结构:

1.SET a,b这个数据的存储结构是怎么样的?

偏移位置说的是哈希表中的存储位置,一般通过hash函数计算出哈希值,hashValue决定了键在哈希表中的存储位置

Redis中的存储是一个字典结构,SET a,b之后,a会放在字典对应的偏移位置,b作为对应的value进行存储

2. SET a 100 ex 60之后,此时这个过期信息是存储在哪里的?

首先如果我们给key a添加一个过期时间,会将key a 添加到 对应的过期字典中,并存储对应时间戳

3.某个key有过期时间之后,那么他即在数据字典里,又在过期字典里,这是占了两份内存吗?

分析:

1. 数据字典(main dictionary)

这是 Redis 存储所有有效键值对的地方。当一个 key 被设置了过期时间时,它首先存储在数据字典中(键和对应的值)。如果没有过期时间,键值对就只会存在于数据字典中。

2. 过期字典(expires dictionary)

Redis 维护一个专门的过期字典来存储具有过期时间的键。在过期字典中,Redis 会存储键和过期时间的映射。这个字典是为了让 Redis 能快速判断某个 key 是否已过期,以便及时进行过期检查和清理。

3. 内存占用

当一个 key 设置了过期时间时,它会同时存在于这两个字典中,因此看起来是占了两份内存。具体来说:

  • 数据字典存储键值对(key-value)。

  • 过期字典存储键和过期时间(key-expiration time)。

然而,这并不意味着 Redis 会额外占用大量的内存,因为:

  • 过期字典只存储键的过期时间,而不存储实际的值。这意味着过期字典占用的内存相对较少,通常只存储键和过期时间的映射

  • Redis 在每次访问一个键时,会检查该键是否存在于过期字典中,并且判断是否已过期。如果已过期,它会从数据字典中删除该键。

答案:

两个字典存储的都是这个key的引用,也就是底层String对象的引用,不会重复存储key本身,Redis对内存的使用是很珍惜的

Redis是单线程还是多线程(重点理解)

分析:

单线程的,Redis使用IO多路复用(单个线程同时监听多个管道),如果使用多个线程,会造成上下文切换。

在Redis中,事件是指客户端请求的命令,对于同时到达的这个概念理论上来说不会存在,他们之间 的到达时刻肯定会有微小的差别(这是一个规则)

然后命令都是原子操作,也不需要加锁,不会有cpu的损耗

所以影响redis性能的一般都是外界IO的传输,redis基本上有最高效的数据结构

相关推荐
倔强青铜三1 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
RestCloud5 小时前
SQL Server到Hive:批处理ETL性能提升30%的实战经验
数据库·api
RestCloud5 小时前
为什么说零代码 ETL 是未来趋势?
数据库·api
天天扭码5 小时前
来全面地review一下Flex布局(面试可用)
前端·css·面试
Mor_6 小时前
UE5 网络通信协议学习笔记
面试
沐怡旸6 小时前
【底层机制】std::unique_ptr 解决的痛点?是什么?如何实现?怎么正确使用?
c++·面试
前端缘梦6 小时前
Vue Keep-Alive 组件详解:优化性能与保留组件状态的终极指南
前端·vue.js·面试
ClouGence7 小时前
CloudCanal + Paimon + SelectDB 从 0 到 1 构建实时湖仓
数据库
前端付豪8 小时前
1、震惊!99% 前端都没搞懂的 JavaScript 类型细节
前端·javascript·面试
Java水解9 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试