在一定时间内,被频繁访问的key称为 热点key 。比如突发性新闻,微博上常见的热搜新闻,引起千千万万人短时间内浏览;在线商城大促活动,消费者比较关注的商品突然降价,引起成千上万消费者点击、购买。热点key会导致流量过于集中,缓存服务器的压力骤然上升,如果超出物理机器的承载能力,则缓存不可用,进而可能诱发缓存击穿、缓存雪崩的问题。
通过将数据的写入与读取分散去各个节点,通过数据复制到达各个节点数据一致性的目的。在写少的情形下,master节点写入数据,在读取请求压力大的情形下,配置多个slave节点,数据横向同步(拓扑结构)。结合Redis Sentinel (或其他高可用技术)实现缓存节点的高可用。
在热点 Key
的处理上主要分为写入跟读取两种形式,在数据写入过程当 SLB
收到数据 key1
并将其通过某一个 Proxy
写入一个 Redis
,完成数据的写入。假若经过后端热点模块计算发现 key1
成为热点 key
后, Proxy
会将该热点进行缓存,当下次客户端再进行访问 key1
时,可以不经 Redis
。最后由于 Proxy
是可以水平扩充的,因此可以任意增强热点数据的访问能力。
如果key存在,那么不要设置key过期时间,如果key对应的数据不可用(比如删除了),那么从缓存中删除key。从请求来说,如果在缓存找到对应的key,表明该key及其value就是用户需要的数据。如果缓存中不存在对应的key,表明无对应的数据,返回空值。比如微博发来爆料某明星文章,短时间内访问量直接上升,如果key不过期,那么请求永远命中缓存。只有当文章被删除的时候,才从缓存中删除对应的key,如果此时还有请求访问,在缓存中查无数据时,直接返回空值,表明文章被删除。当然也可以更新key对应的value值,返回想要表达的value。
参考资料: