Redis内存面试与分析

打印 上一主题 下一主题

主题 1012|帖子 1012|积分 3036

分析:
首先,redisDb代表的是Redis的数据布局,我们主要关注dict这个数据布局
另有一个expires存储的是我们的逾期值,这个也要记住

以下是dict:
  1. typedef struct dict {
  2.     dictType *type;        // 类型相关的操作
  3.     void *privdata;        // 额外的私有数据
  4.     dictEntry **ht[2];     // 哈希表的两个版本(用于处理扩容)
  5.     unsigned long size[2]; // 当前哈希表的大小
  6.     unsigned long used[2]; // 已使用的槽数
  7.     long rehashidx;        // 当前正在进行的扩容位置(如果有扩容)
  8.     unsigned long iterators; // 当前正在进行的迭代器数量
  9. } 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基本上有最高效的数据布局

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表