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基本上有最高效的数据结构

相关推荐
代码游侠2 分钟前
应用——Linux 标准IO编程
linux·前端·数据库·学习·算法
Hello.Reader5 分钟前
Flink SQL Window Join 把时间维度“写进” JOIN 条件里
数据库·sql·flink
爬山算法10 分钟前
Redis(172)如何使用Redis实现分布式队?
数据库·redis·分布式
古城小栈15 分钟前
QPS统计好,睡觉不会被打扰
运维·数据库·压力测试
shayudiandian16 分钟前
一键部署MySQL黑科技
数据库·科技·mysql
Misnice20 分钟前
使用 SQLAlchemy 连接数据库
数据库·python·mysql·fastapi
Shingmc326 分钟前
MySQL数据类型
数据库·mysql
秦jh_29 分钟前
【Qt】信号与槽
服务器·开发语言·数据库·qt
微信-since8119229 分钟前
[ruby on rails] pg 数据库性能问题排查与解决完整记录
数据库·ruby on rails·oracle
Java天梯之路29 分钟前
Java SPI:服务发现的轻量级标准
java·面试·服务发现