Redis 为什么这么快?( 二 )

  • 把哈希表 1 中的数据重新映射并拷贝到哈希表 2 中
  • 释放哈希表 1的空间
  • 在上面的第二步涉及大量的数据拷贝 , 如果一次性把哈希表 1 中的数据都迁移完 , 会造成 Redis 线程阻塞 , 无法服务其他请求 。此时 , Redis 就无法快速访问数据了 。
    Redis 为什么这么快?

    文章插图
    图片
    在Redis 开始执行 ReHash , Redis仍然正常处理客户端请求 , 但是要加入一个额外的处理处理
    第1个请求时 , 把哈希表 1中的第1个索引位置上的所有 entries 拷贝到哈希表 2 中
    处理第2个请求时 , 把哈希表1中的第2个索引位置上的所有 entries 拷贝到哈希表 2中
    如此循环 , 直到把所有的索引位置的数据都拷贝到哈希表 2 中 。
    这样就实现了刚才了不起说的 , 把一次大量拷贝的开销 , 分摊到多次处理请求的过程中 , 避免耗时操作 , 保证数据的快速访问 。
    关于 渐进式的 ReHash 就说完了 , 那么这个缓存时间戳又是用来干嘛的呢?
    缓存时间戳这个缓存时间戳 , 也是 Redis 快的另外一个主要的原因 , 几乎是 ReHash 并列的呀 。
    我们在开发中使用时间戳 , 一般都是使用的 System 的方法 , 也就是 currentTimeMillis()来获取时间戳的 , 但是这是我们在 JAVA 代码中的 , 而 Redis 显然不能这么用 , 因为每一次获取系统时间戳都是一次系统调用(涉及到上下文切换) , 所以系统调用相对来说是比较费时间的 , 作为单线程的 Redis 承受不起 , 所以它需要对时间进行缓存 , 由一个定时任务 , 每毫秒更新一次时间缓存获取时间都是从缓存中直接拿 。
    而这就是 缓存时间戳 , 所以 , 在面试中如果有面试官问到 Redis 为什么这么快的时候 , 你知道应该怎么回答了么?

    【Redis 为什么这么快?】


    推荐阅读