本文共 662 字,大约阅读时间需要 2 分钟。
今天从掘金网站看到一张高并发系统中的缓存设计图,如下:
图片来源:
针对这张图,写一下我对缓存的思考:
首先,分析一下系统中缓存的位置都有哪些,常见的缓存位置包括:
1.浏览器页面缓存
2.路由网关可以有缓存,进行限流等操作
3.应用级别缓存,主要是业务数据,常见的redis、memorycache等
4.持久层框架缓存,比如hibernate,mybatis都有缓存
5.数据库查询sql缓存
限流部分:
利用redis+lua脚本实现原子操作,提高并发性能。
业务数据
利用redis 集群+主从模式构建,为什么呢?为了读写分离,提高性能。本架构中,redis slave集群读取数据,不修改缓存数据,只读操作。
那么缓存数据如何修改呢?我们原来简单的处理是:同步修改数据库和缓存,显然提高了查询效率(如果命中),但是有侵入性,当然可以抽象缓存的操作。
另一个方式就是修改数据库,然后异步修改缓存,怎么解决呢?增加一层中间件,比如阿里巴巴的canel,适用于定于mysql binlog,充当mysql 从节点的角色,
从mysql主机获取bin log,然后推送到kafka、ES等中间价,当然也可以是redis。
实时性呢?是不是会读取到脏数据呢?考虑两个异步问题:
1. 从mysq通过canel读取bin log推送到redis master集群的延迟问题
2.从redis master集群异步同步数据到redis slave集群的延迟问题
数据库数据“复制”方法
通过canel实现,架构如下:
图片来源:
转载地址:https://kerry.blog.csdn.net/article/details/110569586 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!