华为架构师与你一起探索高并发缓存架构(有示例代码)
对于高并发的系统,所有的请求都打在数据库上是不明智的选择。一般的做法是通过缓存来缓解数据库的压力。缓存是用于解决高并发场景下系统的性能及稳定性问题的银弹。最主要的就是要考虑到缓存的穿透性和数据一致性问题。
先来看一个示例:
这是一个简单应用缓存的示例,存在以下几个问题:
1:高并发的情况下,大部分请求会直接访问数据库。多线程的情况下,缓存还没及时写入,就会有大部分请求直接访问数据库。
2:业务逻辑与缓存之间解耦性太高。
先来解决第一个问题。就是利用锁的机制。但是要考虑加锁的地方,加的不对会导致性能问题,比如不能加到整个方法上。
接下来解决第二个问题,这就是解耦问题,让别的人也可以轻松使用这个缓存方法。那就是使用模板设计模式,做一个缓存模板。
调用方式:
目前为止,是一个相对比较完美的方案了。
但是作为架构师,眼界还需要再开阔一下,那就是需要实现一个更加方便的架构供更多的人灵活调用。给大家提示一下,借鉴Spring cache的思想使用AOP + Annotation等技术实现缓存与业务逻辑的解耦。
大概的流程如下:
1 . 获取到拦截方法的 @Cache 注解,并生成缓存 key;
2 . 通过缓存 key,去缓存中获取数据;
3 . 如果缓存命中,执行如下流程:
-
如果需要自动加载,则把相关信息保存到自动加载队列中;
-
否则判断缓存是否即将过期,如果即将过期,则会发起异步刷新;
-
最后把数据返回给用户。
4 . 如果缓存没有命中,执行如下流程:
-
选举出一个 leader 回到数据源中去加载数据,加载到数据后通知其它请求从内存中获取数据(拿来主义机制);
-
leader 负责把数据写入缓存;如果需要自动加载,则把相关信息保存到自动加载队列中;
-
最后把数据返回给用户。
本文地址:https://blog.csdn.net/python8989/article/details/107487863