Redis复习

常见题

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利用有序集合和分数来实现缓存时戳,并通过快速的获取和删除操作来提高缓存的性能。