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 中有 hash 和 set 类型的字典,每种类型的字典操作(如计算哈希值)可能不同。

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

相关推荐
Nturmoils7 小时前
集中式与分布式怎么选:从订单读写看 KingbaseES 的架构边界
数据库
岁月宁静7 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
xiaomuzuirenzhen7 小时前
大专电子商务从事电商运营分析师需要考证吗?
大数据·数据库
Dream it possible!10 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
翔云12345610 小时前
RocksDB中,客户端每写入一次数据,需要访问几次磁盘
运维·数据库·mysql
DevOpenClub10 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
aiks_yuan11 小时前
Token 放 Redis 还是用 JWT:Java 实测验签和查 Redis 耗时,退出登录、改密码踢下线怎么做(jjwt 0.12 + Redis 7.2)
redis
GeW11 小时前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
在多学一点13 小时前
MYSQL第二次作业
android·数据库·mysql
yeccheng13 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试