本地缓存和分布式缓存
分布式缓存 | 本地缓存 | |
---|---|---|
是否外部服务 | 是(独立的系统) | 否(应用中的组件) |
使用维护复杂度 | 高 | 低 |
速度 | 低 | 高(无网络开销和序列化) |
是否适用于分布式服务 | 适用 | 不适用(数据存在各节点内存中,需要手动维护保持各节点缓存一致才适用) |
优点 | 一致性更好;不受应用宕机影响;可以存储大数据量; | 速度更快;操作简单 |
缺点 | 需要单独维护独立的系统复杂度更高;速度比本地缓存慢; | 分布式服务中可能存在缓存不一致情况;占用服务本身的堆内存,影响垃圾回收,影响系统性能;系统重启后丢失;储存能力有限; |
使用场景 | 所有缓存使用场景; | 单个实例的服务,较小且频率可见的访问场景,或者数据基本不会变化的数据,读; |
常见技术方案 | redis(优);MemCached | Caffeine(优) ;Guava Cache; |
-解决分布式服务使用本地缓存的方案
可以维护一个静态ConcurrentMap,key为具体
业务名,value为List缓存,在获取缓存的地方改为先从这个map里拿,拿不到再从redis里拿,拿完再放到map里即可,
当然维护这个缓存的方式就稍微麻烦点,由于部署是集群的,所以要保证每台节点的本地缓存(副本)都要被维护,因此可以简单利用redis做一个广播消息,在维护的地方发布个订阅消息,然后在消费者端接受到将map里对应的数据清除即可(每一台节点都会收到这个消息并清除map数据,当然重启也没事,重启过后map是空的,重新拿一下就好)