分析:
首先,redisDb代表的是Redis的数据布局,我们主要关注dict这个数据布局
另有一个expires存储的是我们的逾期值,这个也要记住
以下是dict:
- 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基本上有最高效的数据布局
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |