说到缓存,可能最熟悉的是缓存的使用和更新策略。使用缓存的好处很多,可以提高响应速度,减轻数据库等存储的读写压力。关键是变“快”了。使用缓存有很多注意的地方,比如何时使用缓存,什么数据适合缓存,缓存什么时候失效。缓存是提高程序性能的“银弹”,不过这里不是将如何使用缓存,而是介绍缓存前置的思路和一些实践。
缓存前置
这里的缓存指的是应用缓存,或者说本地缓存,那么缓存前置就是指服务端的本地缓存转移到客户端,这样客户端就可以直接客户端的应用缓存了,只有服务端的数据发生更新后才会触发客户端进行一次远程调用。
这样做的好处是客户端可以直接在本地内存就可以获取数据,大大提高了响应速度,从执行链路上看就是减少了网络传输的消耗。
根据场景划分,缓存前置可以分为以下几种场景:
允许数据短暂不一致
实时生效
允许短暂不一致
允许短暂不一致意味着服务端的数据更新不需要立即通知客户端缓存失效,比如2分钟。这样客户端最多有2分钟读到的是脏数据,可以在服务端接口包装一层本地缓存,客户端只需要配置这个bean就可以直接使用了,以Java、dubbo为例,有Ehcache、Caffeine、Guava Cache。
这种场景实现较为简单,但是缺点是客户端原来使用dubbo接口的地方需要改代码,但是可以减少客户端RPC调用的次数,提高响应RT。
实时生效
这种场景复杂一些,意味着dubo接口的包装类不能简单设置一个缓存失效时间,那么怎么解决服务端更新立即通知客户端失效本地缓存呢?使用消息。