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

相关推荐
【心态好不摆烂】10 小时前
MySQL——复合查询
数据库·mysql
AC赳赳老秦10 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
瞬间&永恒~11 小时前
【MySQL】 InnoDB 锁等待排查与并发压测实验
运维·数据库·mysql
布鲁飞丝11 小时前
对 .NET线程 异常退出引发程序崩溃的反思
数据库·c#·.net
zcmodeltech11 小时前
智能矿井沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的感知-传输-控制一体化方案
服务器·数据库·分布式·stm32·单片机·嵌入式硬件
用户28735553259211 小时前
OpenResty 中 Lua 脚本实战示例(分场景讲清 Lua 解决了 Nginx 原生做不到的事)
面试
帅次12 小时前
Android 应用高级面试:Window 近1年高频追问 18 题
android·面试·职场和发展
江晓鱼未暖12 小时前
十七、Redis 核心原理与架构详解
大数据·数据库·数据仓库·redis·缓存·架构
copyer_xyf12 小时前
PostgreSQL 做向量检索:一条单库路线
数据库·agent·nestjs
Access开发易登软件12 小时前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access