若何说服手艺老迈用 Redis ?:比分曲播

那个问题很微妙,可能那位同窗心里深处,觉得 Redis 是所有应用缓存的标配比分曲播。

缓存的世界很宽广,关于 应用系统来讲,我们经常将缓存划分为 当地缓存和 散布式缓存比分曲播。

当地缓存:应用中的缓存组件,缓存组件和应用在统一历程中,缓存的读写十分快,没有收集开销比分曲播。但各应用或集群的各节点都需要维护本身的零丁缓存,无法共享缓存。

散布式缓存:和应用别离的缓存组件或办事,与当地应用隔离,多个应用可间接共享缓存比分曲播。

1 缓存的素质

我们常常会讲:“加了缓存,我们的系统就会更快” 比分曲播。

所谓的 “更快”比分曲播,素质上做到了如下两点:

减小 CPU 消耗 将本来需要实时计算的内容提早算好、把一些公用的数据停止复用,那能够削减 CPU 消耗,从而提拔响应性能比分曲播。

减小 I/O 消耗 将本来对收集、磁盘等较慢介量的读写拜候变成对内存等较快介量的拜候,从而提拔响应性能比分曲播。

假设能够通过加强 CPU、I/O 自己的性能来满足需求的话, 晋级硬件往往是更好的处理计划,即便需要一些额外的投入成本,也凡是要优于引入缓存后可能带来的风险比分曲播。

从开发角度来说,引入缓存会进步系统复杂度,因为你要考虑缓存的失效、更新、一致性等问题比分曲播。

从运维角度来说,缓存会掩盖掉一些缺陷,让问题在更久的时间以后,呈现在间隔发作现场更远的位置上比分曲播。

从平安角度来说,缓存可能泄露某些保密数据,也是容易遭到攻击的单薄点比分曲播。

因而, 缓存是把双刃剑比分曲播。

2 当地缓存 JDK Map

JDK Map 经常用于缓存实现:

HashMap HashMap 是一种基于哈希表的集合类,它供给了快速的插入、查找和删除操做比分曲播。能够将键值对做为缓存项的存储体例,将键做为缓存项的独一标识符,值做为缓存项的内容。

ConcurrentHashMap ConcurrentHashMap 是线程平安的 HashMap,它在多线程情况下能够包管高效的并发读写操做比分曲播。

LinkedHashMap LinkedHashMap 是一种有序的 HashMap ,它保留了元素插入的挨次,能够根据插入挨次或者拜候挨次停止遍历比分曲播。

TreeMap TreeMap 是一种基于红黑树的有序 Map,它能够根据键的挨次停止遍历比分曲播。

笔者曾经负责艺龙红包系统, 红包活动就是 存储在ConcurrentHashMap中 ,通过 按时使命刷新缓存比分曲播。

若何说服手艺老迈用 Redis ?:比分曲播

核心流程:

1、红包系统启动后比分曲播,初始化一个 ConcurrentHashMap 做为红包活动缓存 ;

2、数据库查询所有的红包活动比分曲播,并将活动信息存储在 Map 中;

3、按时使命每隔 30 秒 ,施行缓存加载办法,刷新缓存比分曲播。

为什么红包系统会将红包活动信息存储在当地内存 ConcurrentHashMap 呢 比分曲播?

红包系统是高并发应用比分曲播,快速将恳求成果响应给前端,大大提拔用户体验;

红包活动数量其实不多比分曲播,就算全数放入到 Map 里也不会产生内存溢出的问题;

按时使命刷新缓存其实不会影响红包系统的营业比分曲播。

笔者见过良多 单体应用都利用那种计划,该计划的特点是简洁易用,工程实现也容易 比分曲播。

3 当地缓存框架

固然利用 JDK Map 能快速构建缓存,但缓存的功用仍是比力孱弱的比分曲播。

因为现实场景里,我们可能需要给缓存添加 缓存统计、 过时失效、 裁减战略等功用比分曲播。

于是, 当地缓存框架应运而生比分曲播。

流行的 Java 缓存框架包罗:Ehcache , Google Guava , Caffine Cache 比分曲播。

若何说服手艺老迈用 Redis ?:比分曲播

下图展现了 Caffine 框架的利用示例比分曲播。

若何说服手艺老迈用 Redis ?:比分曲播

固然当地缓存框架的功用很强大,但是当地缓存的缺陷仍然明显比分曲播。

1、高并发的场景比分曲播, 应用重启之后,当地缓存就失效了,系统的负载就比力大,需要花较长的时间才气恢复;

2、每个应用节点城市维护本身的零丁缓存, 缓存同步比力头疼比分曲播。

4 散布式缓存

散布式缓存是指将缓存数据散布在多台机器上,以进步缓存容量和并发读写才能的缓存系统比分曲播。散布式缓存凡是由多台机器构成一个集群,每台机器上都运行着不异的缓存办事历程,缓存数据被平均地散布在集群中的各个节点上。

Redis 是散布式缓存的首选,以至我们一提到缓存,良多后端工程师起首想到的就它比分曲播。

下图是神州专车订单的 Redis 集群架构 比分曲播。将 Redis 集群拆分红四个分片,每个分片包罗一主一从,主从能够切换。应用 A 按照差别的缓存 key 拜候差别的分片。

若何说服手艺老迈用 Redis ?:比分曲播

与当地缓存比拟比分曲播,散布式缓存具有以下长处:

1、容量和性能可扩展

通过增加集群中的机器数量,能够扩展缓存的容量和并发读写才能比分曲播。同时,缓存数据关于应用来讲都是共享的。

2、高可用性

因为数据被散布在多台机器上,即便此中一台机器毛病,缓存办事也能继续供给办事比分曲播。

但是散布式缓存的缺点同样不容轻忽比分曲播。

1、收集延迟

散布式缓存凡是需要通过收集通信来停止数据读写,可能会呈现收集延迟等问题,相关于当地缓存而言,响应时间更长比分曲播。

2、复杂性

散布式缓存需要考虑序列化、数据分片、缓存大小等问题,相关于当地缓存而言愈加复杂比分曲播。

笔者曾经也认为无脑上缓存 ,系统就必然更快,但曲到一次变乱,关于散布式缓存的不雅念才彻底改动比分曲播。

2014 年,同事开发了比分曲播的系统,所有的恳求都是从散布式缓存 Memcached 中获取后间接响应比分曲播。常规情况下,从缓存中查询数据十分快,但在线用户略微多一点,整个系统就会出格卡。

通过 jstat 号令发现 GC 频次极高,几次恳求就将重生代占满了,并且 CPU 的消耗都在 GC 线程上比分曲播。初步判断是缓存值过大招致的,果不其然,缓存大小在 300k 到 500k 摆布。

处理过程还比力曲折比分曲播,分为两个步调:

修改重生代大小 比分曲播,从本来的 2G 修改成 4G,并精简缓存数据大小 (从均匀 300k 摆布降为 80k 摆布);

把 缓存拆成两个部门 ,第一部门是 全量数据 ,第二部门是 增量数据 (数据量很小)比分曲播。页面第一次恳求拉取全量数据,当比分有变革的时候,通过 websocket 推送增量数据。

颠末此次优化,笔者理解到:缓存固然能够提拔整体速度,但是在高并发场景下,缓存对象大小仍然是需要存眷的点,稍不留心就会产惹事故比分曲播。别的我们也需要合理地控造读取战略,更大程度削减 GC 的频次,从而提拔整体性能。

5 多级缓存

开源中国网站最起头完满是用当地缓存框架 Ehcache 比分曲播。

后来跟着拜候量的激增,呈现了一个可怕的问题:“因为 Java 法式更新很频繁,每次更新的时候都要重启比分曲播。一旦重启后,整个 Ehcache 缓存里的数据都被清掉。重启后若大量拜候进来的话,开源中国的数据库根本上很快就会崩掉”。

于是,开源中国开发了多级缓存框架 J2Cache,利用了多级缓存 Ehcache + Redis比分曲播。

多级缓存有如下优势:

离用户越近比分曲播,速度越快;

削减散布式缓存查询频次比分曲播,降低序列化和反序列化的 CPU 消耗;

大幅度削减收集 IO 以及带宽消耗比分曲播。

当地缓存做为一级缓存,散布式缓存做为二级缓存,起首从一级缓存中查询,若能查询到数据则间接返回,不然从二级缓存中查询,若二级缓存中能够查询到数据,则回填到一级缓存中,并返回数据比分曲播。若二级缓存也查询不到,则从数据源中查询,将成果别离回填到一级缓存,二级缓存中。

若何说服手艺老迈用 Redis ?:比分曲播

2018 年,笔者办事的一家电商公司需要停止 app 首页接口的性能优化比分曲播。笔者花了大要两天的时间完成了整个计划,采纳的是两级缓存形式,同时操纵了 Guava 的惰性加载机造,整体架构如下图所示:

若何说服手艺老迈用 Redis ?:比分曲播

缓存读取流程如下:

1、营业网关刚启动时,当地缓存没有数据,读取 Redis 缓存,若是 Redis 缓存也没数据,则通过 RPC 挪用导购办事读取数据,然后再将数据写入当地缓存和 Redis 中;若 Redis 缓存不为空,则将缓存数据写入当地缓存中比分曲播。

2、因为步调 1 已经对当地缓存预热,后续恳求间接读取当地缓存,返回给用户端比分曲播。

3、Guava 设置装备摆设了 refresh 机造,每隔一段时间会挪用自定义 LoadingCache 线程池(5 个更大线程,5 个核心线程)去导购办事同步数据到当地缓存和 Redis 中比分曲播。

优化后,性能表示很好,均匀耗时在 5ms 摆布比分曲播。最起头我认为呈现问题的几率很小,可是有一天晚上,突然发现 app 端首页显示的数据时而不异,时而差别。

也就是说:固然 LoadingCache 线程不断在挪用接口更新缓存信息,但是各个 办事器当地缓存中的数据并不是完成一致比分曲播。申明了两个很重要的点:

1、惰性加载仍然可能形成多台机器的数据纷歧致

2、LoadingCache 线程池数量设置装备摆设的不太合理比分曲播,招致了线程堆积

最末比分曲播,我们的处理计划是:

1、 惰性加载连系动静机造来更新缓存数据,也就是:当导购办事的设置装备摆设发作变革时,通知营业网关从头拉取数据,更新缓存比分曲播。

2、恰当调大 LoadigCache 的线程池参数,并在线程池埋点,监控线程池的利用情况,当线程忙碌时能发出告警,然后 动态修改线程池参数比分曲播。

6 没有银弹

没有银弹是 Fred Brooks 在 1987 年所颁发的一篇关于软件工程的典范论文比分曲播。

论文强调实正的银弹其实不存在,而所谓的银弹则是指没有任何一项手艺或办法能够能让软件工程的消费力在十年内进步十倍比分曲播。

通俗来讲: 在手艺范畴中没有一种通用的处理计划能够处理所有问题比分曲播。

手艺素质上是为领会决问题而存在的,每个问题都有其奇特的情况和限造前提,没有一种通用的手艺或东西能够完美地处理所有问题比分曲播。

固然手艺不竭开展和前进,但是关于复杂的问题,仍需要连系多种手艺和办法,停止系统性的思虑和综合性的处理计划设想,才气得到更优处理计划比分曲播。

回到文章开头的问题 比分曲播,若何说服手艺老迈用 Redis ?

假设应用就是一个单体应用,缓存能够不共享,通过按时使命刷新缓存对营业没有影响,并且当地内存能够 Hold 住缓存的对象大小,那么你的手艺老迈的计划没有问题比分曲播。

假设应用营业比力复杂,需要利用缓存提拔系统的性能,同时散布式缓存共享的特征关于研发来讲开发愈加快速,Redis 确实是个不错的选择,能够从研发成本、代码维护、人力模子等多个角度和手艺老迈提出本身的概念比分曲播。

总而言之, 在手艺范畴中,没有银弹比分曲播。我们需要不竭摸索和研究新的手艺,但同时也需要认识到手艺的局限性,不自觉逃求所谓的 “银弹”,而是连系详细问题和需求,选择最合适的处理计划。

END

他们在讨论什么比分曲播?

🌟 活动保举

2023 年 5 月 27-28 日,GOTC 2023 全球开源手艺峰会将在上海张 江科学礼堂盛大举行比分曲播。

为期 2 天的开源行业盛会,将以行业展览、主题发言、出格论坛、分论坛、快闪演讲的形式来诠释此次大会主题 ——“Open Source, Into the Future”比分曲播。 与会者将一路切磋元宇宙、3D 与游戏、eBPF、Web3.0、区块链等热门手艺主题,以及 OSPO、汽车软件、AIGC、开源教育培训、云原生等热门话题,切磋开源将来,助力开源开展。

发布于 2023-06-05 03:31:04
分享
海报
48
上一篇:篮球比分:体坛联播|大巴黎官宣梅西离队,曼城击败曼联加冕双冠王 下一篇:比分曲播:俄罗斯蓝球须眉3X3那里有的看曲播比分?
目录

    推荐阅读

    忘记密码?

    图形验证码