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 小时前
简识Redis 持久化相关的 “Everysec“ 策略
数据库·redis·缓存
Leaf吧1 小时前
springboot 配置多数据源以及动态切换数据源
java·数据库·spring boot·后端
狮歌~资深攻城狮2 小时前
TiDB出现后,大数据技术的未来方向
数据库·数据仓库·分布式·数据分析·tidb
狮歌~资深攻城狮2 小时前
TiDB 和信创:如何推动国产化数据库的发展?
数据库·数据仓库·分布式·数据分析·tidb
清风-云烟2 小时前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节
雾里看山2 小时前
【MySQL】数据库基础知识
数据库·笔记·mysql·oracle
draymond71073 小时前
redis-redission的加锁源码与看门狗机制
redis
码农研究僧3 小时前
Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析
数据库·sql·oracle·translate·regexp_like
大码猴4 小时前
用好git的几个命令,领导都夸你干的好~
前端·后端·面试