设计背景

概念

先简单解释下什么是分布式多级缓存,所谓分布式简单理解就是异地跨机房服务应用部署;所谓多级缓存,这里狭义语义指定的是应用服务级别的缓存,通常泛指RedisMemcached等;所谓多级缓存,这里是将JVM级的驻留缓存和外部依赖的缓存服务相比而言的。RedisMemcached等都提供了性能优越的缓存服务,在高并发场景下作为提高吞吐量、优化服务性能的利器立下了汗马功劳。

进行分布式多级缓存设计的初衷是:利用多数据副本保证数据的可用性,同时通过不同数据源特点提供更高性能、更多场景数据差异化的支持。

场景

一般情况下,缓存我们只使用Redis作为唯一缓存就可以满足大多数业务场景。这里我们不考虑一般的业务场景,现在试图将服务场景复杂化去进行设计,进一步提高对服务性能的追求。

举例一个业务场景,假设应用服务每天需要提供亿级别调用量的查询业务,在最原始阶段,外部业务提供有效入参请求服务接口返回业务数据即可,然而在之后需求迭代中,增加了对调用方权限校验(渠道校验、授权码校验、入参许可校验)和对返回业务数据的保护(涉及脱敏和非授权字段的过滤排除),业务逻辑瞬间丰富和复杂起来。

一般场景

[](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/633fd8a0f1584fb7a22ed407ab56aca4~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp?)

复杂场景

[](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/39c2af496ec345cdbfc4571ab3fb3aa6~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp?)

以上复杂场景下,需要解决如下几个问题:

技术调研

这里是基于Java语言实现的,其他语言也可以参考匹配对应技术栈来完成技术调研和设计。

对于二级缓存,选择了功能强大的Redis

对于一级缓存,也就是本地缓存有很多选择性。通常,在Java语言中我们会选择HashMap或线程安全的ConcurrentHashMap作为JVM缓存容器来存储数据。这里推荐可以尝试Caffeine,它是一套封装良好天生为本地缓存服务的框架,提供了诸多缓存特性,号称 ”本地缓存天花板“