常见题
Redis为什么快?
-
基与内存的数据库
-
单线程避免上下文切换的问题
-
渐进式ReHash
Redis的渐进式Rehash是指在Redis进行哈希表扩容时,将旧哈希表中的键值对逐步迁移到新哈希表的过程。
当Redis需要扩大当前使用的哈希表时,它会创建一个新的更大的哈希表,并将所有键值对从旧哈希表迁移到新哈希表。这个过程可能会耗费一定时间,特别是在处理大量数据时。
为了避免在迁移期间造成阻塞,Redis采用了渐进式Rehash策略。它将整个迁移过程分为多个小步骤,每次只迁移一小部分键值对。在每个小步骤中,Redis会将旧哈希表中一个桶(bucket)中的键值对迁移到新哈希表,并更新相应的指针。
通过这种方式,Redis可以在不阻塞客户端请求的情况下进行Rehash操作。同时,在每个小步骤之间,Redis还会检查是否有新请求要访问旧哈希表中的键值对,并将其转发到新哈希表中。这样可以保证即使在Rehash过程中也能正常处理客户端请求。
渐进式Rehash还具有另外一个好处:它可以避免一次性消耗大量内存。因为在整个迁移过程中,旧哈希表和新哈希表会同时存在,直到所有键值对都迁移完成。这样可以确保在迁移过程中Redis的内存占用量不会突然增加。
需要注意的是,渐进式Rehash是一个渐进的过程,并不是一次性完成的。因此,在Rehash期间,旧哈希表和新哈希表会同时存在,并且可能会占用更多的内存。但是一旦迁移完成,Redis就会释放旧哈希表所占用的内存空间。
总结: Redis的渐进式Rehash策略允许在不阻塞客户端请求的情况下进行哈希表扩容,并逐步将键值对从旧哈希表迁移到新哈希表。这种策略可以保证Redis在处理大量数据时仍能保持高性能,并且避免一次性消耗大量内存。 -
缓存时间戳
Redis的缓存时戳是通过使用一个称为"时间戳"的数据结构来实现的。时间戳是一个有序集合,其中每个成员都有一个分数(score)与之关联,表示该成员的排序位置。
当需要进行缓存时,Redis会将要缓存的数据作为成员添加到时间戳中,并为其设置一个分数,通常使用当前时间作为分数。这样就可以根据分数对成员进行排序,使得最新添加的成员排在前面。
当需要从缓存中获取数据时,Redis会根据指定的范围从时间戳中获取成员。
例如,可以通过指定范围来获取最新添加的N个成员,或者获取某个时间段内添加的所有成员。
由于时间戳是有序集合,获取最新添加的N个成员只需要取出前N个成员即可,而不需要遍历整个集合。这样就能够快速地获取最新的缓存数据。另外,Redis还提供了一些操作来支持对时间戳进行修剪和删除操作。
例如,可以通过指定范围来删除某个时间段内的所有成员,或者删除旧于某个特定时间点的所有成员。这样可以保持时间戳中只包含最新和有效的缓存数据。
总结 Redis利用有序集合和分数来实现缓存时戳,并通过快速的获取和删除操作来提高缓存的性能。