亿级系统的Redis缓存怎么设计

发布时间:2021-06-15 10:01:32 作者:小新
来源:亿速云 阅读:193

这篇文章主要介绍亿级系统的Redis缓存怎么设计,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

首先,先了解缓存知识图谱

早期的缓存用于加速CPU数据交换的RAM。随着互联网的快速发展,缓存的应用更加宽泛,用于数据高速交换的存储介质都称之为缓存。

使用缓存时,我们要关注哪些指标?缓存有哪些应用模式?以及缓存设计时有哪些Tip技巧?一图胜千言,如下:

亿级系统的Redis缓存怎么设计  

七大经典问题

缓存在使用过程不可避免会遇到一些问题,对于高频的问题我们大概归为了7类。具体内容下面我们一一道来

1、缓存集中失效

当业务系统查询数据时,首先会查询缓存,如果缓存中数据不存在,然后查询DB再将数据预热到Cache中,并返回。缓存的性能比 DB 高 50~100 倍以上。

亿级系统的Redis缓存怎么设计  

很多业务场景,如:秒杀商品、微博热搜排行、或者一些活动数据,都是通过跑任务方式,将DB数据批量、集中预热到缓存中,缓存数据有着近乎相同的过期时间。

当过这批数据过期时,会一起过期,此时,对这批数据的所有请求,都会出现缓存失效,从而将压力转嫁到DB,DB的请求量激增,压力变大,响应开始变慢。

那么有没有解呢?

当然有了。

我们可以从缓存的过期时间入口,将原来的固定过期时间,调整为过期时间=基础时间+随机时间,让缓存慢慢过期,避免瞬间全部过期,对DB产生过大压力。

2、缓存穿透

不是所有的请求都能查到数据,不论是从缓存中还是DB中。

假如黑客攻击了一个论坛,用了一堆肉鸡访问一个不存的帖子id。按照常规思路,每次都会先查缓存,缓存中没有,接着又查DB,同样也没有,此时不会预热到Cache中,导致每次查询,都会cache miss。

由于DB的吞吐性能较差,会严重影响系统的性能,甚至影响正常用户的访问。

解决方案:

3、缓存雪崩

缓存雪崩是指部分缓存节点不可用,进而导致整个缓存体系甚至服务系统不可用的情况。

分布式缓存设计一般选择一致性Hash,当有部分节点异常时,采用 rehash 策略,即把异常节点请求平均分散到其他缓存节点。但是,当较大的流量洪峰到来时,如果大流量 key 比较集中,正好在某 1~2 个缓存节点,很容易将这些缓存节点的内存、网卡过载,缓存节点异常 Crash,然后这些异常节点下线,这些大流量 key 请求又被 rehash 到其他缓存节点,进而导致其他缓存节点也被过载 Crash,缓存异常持续扩散,最终导致整个缓存体系异常,无法对外提供服务。

解决方案:

4、缓存热点

对于突发事件,大量用户同时去访问热点信息,这个突发热点信息所在的缓存节点就很容易出现过载和卡顿现象,甚至 Crash,我们称之为缓存热点。

亿级系统的Redis缓存怎么设计  

这个在新浪微博经常遇到,某大V明星出轨、结婚、离婚,瞬间引发数百千万的吃瓜群众围观,访问同一个key,流量集中打在一个缓存节点机器,很容易打爆网卡、带宽、CPU的上限,最终导致缓存不可用。

解决方案:

可以设计一个缓存服务治理管理后台,实时监控缓存的SLA,并打通分布式配置中心,对于一些hot key可以快速、动态扩容。

5、缓存大Key

当访问缓存时,如果key对应的value过大,读写、加载很容易超时,容易引发网络拥堵。另外缓存的字段较多时,每个字段的变更都会引发缓存数据的变更,频繁的读写,导致慢查询。如果大key过期被缓存淘汰失效,预热数据要花费较多的时间,也会导致慢查询。

所以我们在设计缓存的时候,要注意缓存的粒度,既不能过大,如果过大很容易导致网络拥堵;也不能过小,如果太小,查询频率会很高,每次请求都要查询多次。

解决方案:

6、缓存数据一致性

缓存是用来加速的,一般不会持久化储存。所以,一份数据通常会存在DB和缓存中,由此会带来一个问题,如何保证这两者的数据一致性。另外,缓存热点问题会引入多个副本备份,也可能会发生不一致现象。

亿级系统的Redis缓存怎么设计  

解决方案:

7、数据并发竞争预热

互联网系统典型的特点就是流量大,一旦缓存中的数据过期、或因某些原因被删除等,导致缓存中的数据为空,大量的并发线程请求(查询同一个key)就会一起并发查询数据库,数据库的压力陡然增加。

亿级系统的Redis缓存怎么设计  

如果请求量非常大,全部压在数据库,可能把数据库压垮,进而导致整个系统的服务不可用。

解决方案:

亿级系统的Redis缓存怎么设计  

为了便于理解,简单画了个流程图。这里面特别注意一个点,由于有一个并发时间差,所以会有一个二次check缓存是否有值的校验,防止缓存预热重复覆盖。

缓存设计时,有很多技巧,优化手段也是千变万化,但是我们要抓住核心要素。那就是,让访问尽量命中缓存,同时保持数据的一致性。

粉丝提问,分割线-----------

4年Java开发经验,面试经常被问到高并发、性能调优方面的问题,该怎么办?

无论是618、双十一以及双十二都是离不开高并发的。  当然不同量级的系统也会有不同的问题,毕竟谁都不是淘宝,对吧,同样的,针对不同的需求以及业务场景,也就会有对架构设计的不同需求。同样的,  高并发系统的演进也不是一步到位的,它是循序渐进,不断改进的,像几年前,双十一卡崩,无法付款无法选择地址的事情每年都会发生,但是今年的情况是不是好一些呢?就是在这些不断地改进过程中,以解决系统中存在的问题为目的和驱动力的系统设计得以进行,而阿里,正是在这方面的最佳实践者。  有人可能会说,他们有服务器啊(要不把你程序放在他们服务器上抵抗亿级并发的冲击试试?)

阿里作为国内互联网行业的老大哥,也正是考虑到这一点,不是所有人都能投入那么多的资金,所以对于系统优化部分,也是不遗余力  。经过多年的历练,阿里也慢慢总结形成一套他们内部的开发笔记——《阿里P9纯手打亿级高并发系统设计手册》

这份笔记分为基础篇、数据库篇、缓存篇、消息队列篇、分布式服务篇、维护篇、实战篇,下面小编就以截图的方式带大家看看, 如果有需要完整版本的朋友们,可以  点击此处   凭截图免费获取

基础篇

亿级系统的Redis缓存怎么设计  

亿级系统的Redis缓存怎么设计  

数据库篇

亿级系统的Redis缓存怎么设计  

亿级系统的Redis缓存怎么设计  

缓存篇

亿级系统的Redis缓存怎么设计  

亿级系统的Redis缓存怎么设计  

消息队列篇

亿级系统的Redis缓存怎么设计  

亿级系统的Redis缓存怎么设计  

分布式服务篇

亿级系统的Redis缓存怎么设计  

分布式系统如何寻址

亿级系统的Redis缓存怎么设计  

维护篇

亿级系统的Redis缓存怎么设计  

亿级系统的Redis缓存怎么设计  

实战篇

亿级系统的Redis缓存怎么设计  

亿级系统的Redis缓存怎么设计  

最后

在这个电商的时代,如何运用自如的使用高并发秒杀系统,提升秒杀的性能,只有系统稳定了,无论是低峰、高峰的流量都是可以控制住的。

以上是“亿级系统的Redis缓存怎么设计”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. 如何设计QQ好友系统
  2. 调度系统的设计原理是什么

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

redis

上一篇:typescript源码中怎么用状态机简化代码中复杂的If Else逻辑

下一篇:怎么在mac中使用jad命令

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》