资讯专栏INFORMATION COLUMN

微服务化之缓存设计

zhonghanwen / 2652人阅读

摘要:微服务化之缓存设计一为什么需要缓存缓存作为微服务化设计的一把利剑,解决了高并发大数据场景下的数据预读能力,大大提高了服务的性能。缓存过期策略有三种定时过期定时同步刷新定时异步刷新。因此选择远程缓存。

微服务化之缓存设计 一、为什么需要缓存

缓存作为微服务化设计的一把利剑,解决了高并发、大数据场景下的数据预读能力,大大提高了服务的性能。可以说缓存无处不在,但是真正使用好缓存并不是一件容易的事情。
本人目睹过很多缓存设计欠佳的项目,很多都没有考虑一致性问题,甚至有的连最基本的防止雪崩的能力都没有。
本文就个人经历并结合自己的思考提炼了一些设计要点,目的就是让大家可以更好的使用缓存,希望大家能有所收获。

二、缓存技术选型

缓存的重要性不言而喻,接下来我们需要考虑缓存的技术选型。是选择本地缓存,还是考虑远程缓存?如果使用远程缓存,是选择Memcache还是Redis?本节主要解答这些疑问。

1、本地缓存

本地缓存的好处:1)成本低,包括硬件成本和维护成本;2)速度更快,相对远程缓存少了一次网络交互
本地缓存的弊端:1)一致性很难保证;2)多次预热,对底层存储有一定压力(可以忽略,但是也作为一个分析项)
通过上述对比分析,当业务场景对一致性要求比较低的情况下可以优先考虑本地缓存。

2、MC or Redis ?

Redis适用场景:需要持久化,数据内容比较大,需要复杂的数据结构,有高可用的需求。
MC适用场景:纯KV,数据量和并发量非常大,使用MC更合适。

三、缓存设计要点

1、缓存 淘汰or更新?

数据有变更时,到底是对缓存进行淘汰还是更新操作?

总结:
1)一般选择淘汰缓存,任何场景都适用
2)在部分情形下,更新缓存可以提高性能(减少一次cache miss)

2、先操作 数据库or缓存?

数据有变更时,是先操作数据库还是先操作缓存?
先操作数据库,后操作缓存:存在原子性问题
先set缓存,后操作数据库:存在原子性问题
总结:先淘汰缓存,后操作数据库

3、缓存过期策略

为什么需要为缓存设置过期时间,或者说什么场景下需要为缓存设置过期时间?
数据变更有两种情况:1)可以收到数据变更的通知;2)无法感知数据变更。针对第一种情况,我们可以收到通知后,淘汰或者更新缓存。而第二种情况,就需要定时操作缓存。
缓存过期策略有三种:1)定时过期;2)定时同步刷新;3)定时异步刷新。
定时过期:会造成一次cache miss
定时同步刷新:更新缓存线程被阻塞,其他线程返回旧的缓存值。
定时异步刷新:缓存值异步更新,所有请求线程返回旧的缓存值。
从左到右,一致性降低,性能提高。

4、主从数据不一致优化
为提高数据库的读性能,我们在很多场景下都采用了读写分离。由于主从同步需要时间,所以在同步时间差内如果有读请求,会导致不一致的情况。如果引入缓存,不一致的时间会更长。
有两个优化方向:
1) 从库同步完立即淘汰缓存,减小不一致的时间;
2) 从库同步完成前,读请求访问主库。
当然,该节主要是讨论如何解决同步导致的不一致问题。如果使用场景对一致性要求不高的话,完全可以忽略,或者不做读写分离。

四、相关案例分析

案例一:缓存第三方公司的天气数据,供公司内部各个业务线使用。
1)由于第三方公司的数据是要付费的,所以在满足需要的情况下,尽可能的减少调用次数。因此选择远程缓存
2)天气数据结构非常简单,最普通的k-v存储,MC完全满足需要。
3)由于天气数据来源于第三方,数据变更无法感知,所以采用缓存过期策略
4)对一致性要求不高,因此采用性能最好的定时异步更新策略

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/62034.html

相关文章

  • 务化缓存设计

    摘要:微服务化之缓存设计一为什么需要缓存缓存作为微服务化设计的一把利剑,解决了高并发大数据场景下的数据预读能力,大大提高了服务的性能。缓存过期策略有三种定时过期定时同步刷新定时异步刷新。因此选择远程缓存。 微服务化之缓存设计 一、为什么需要缓存 缓存作为微服务化设计的一把利剑,解决了高并发、大数据场景下的数据预读能力,大大提高了服务的性能。可以说缓存无处不在,但是真正使用好缓存并不是一件容易...

    CoderDock 评论0 收藏0
  • 务化缓存设计

    摘要:微服务化之缓存设计一为什么需要缓存缓存作为微服务化设计的一把利剑,解决了高并发大数据场景下的数据预读能力,大大提高了服务的性能。缓存过期策略有三种定时过期定时同步刷新定时异步刷新。因此选择远程缓存。 微服务化之缓存设计 一、为什么需要缓存 缓存作为微服务化设计的一把利剑,解决了高并发、大数据场景下的数据预读能力,大大提高了服务的性能。可以说缓存无处不在,但是真正使用好缓存并不是一件容易...

    PrototypeZ 评论0 收藏0
  • Java面试通关要点汇总集

    摘要:本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答。敬请关注服务端思维微信公众号,获取最新文章。 原文地址:梁桂钊的博客博客地址:http://blog.720ui.com 这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术。本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进...

    gougoujiang 评论0 收藏0
  • 架构 - 收藏集 - 掘金

    摘要:浅谈秒杀系统架构设计后端掘金秒杀是电子商务网站常见的一种营销手段。这两个项目白话网站架构演进后端掘金这是白话系列的文章。 浅谈秒杀系统架构设计 - 后端 - 掘金秒杀是电子商务网站常见的一种营销手段。 不要整个系统宕机。 即使系统故障,也不要将错误数据展示出来。 尽量保持公平公正。 实现效果 秒杀开始前,抢购按钮为活动未开始。 秒杀开始时,抢购按钮可以点击下单。 秒杀结束后,按钮按钮变...

    Riddler 评论0 收藏0
  • 务化无状态化与容器化

    摘要:然而在微服务化之前,建议先进行容器化,在容器化之前,建议先无状态化,当整个流程容器化了,以后的微服务拆分才会水到渠成。 此文已由作者刘超授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 一、为什么要做无状态化和容器化 很多应用拆分成微服务,是为了承载高并发,往往一个进程扛不住这么大的量,因而需要拆分成多组进程,每组进程承载特定的工作,根据并发的压力用多个副本公共...

    seanlook 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<