1.本地缓存考虑因素

因素 特性
存储 可读写
原子操作 并发容器实现 ConcurrentHashMap
缓存容量 支持设置缓存大小
淘汰策略 LFU , LRU
过期时间淘汰 定时、懒式、定期
可持久化 可序列化到磁盘以及反序列化

2.最佳实践

2.1 基于ConcurrentHashMap实现本地缓存

2.2 基于Guava Cache实现本地缓存

3.本地缓存一致性问题

因为JVM缓存是在每一个节点上的,可能上次请求到A节点上生成,下次就在B节点上更新或删除。
因此两级缓存与数据库的数据要保持一致,一旦数据发生了修改,在修改数据库的同时,本地缓存、远程缓存应该同步更新。

3.1 解决方案:MQ

一般现在部署都是集群部署,有多个不同节点的本地缓存;
可以使用MQ的广播模式,当数据修改时向MQ发送消息,节点监听并消费消息,直接删除本地JVM缓存,达到最终一致性;
image.png

3.2 解决方案:Canal+MQ

订阅数据库变更日志,再操作缓存。Canal 订阅Mysql的 Binlog日志,当发生变化时向MQ发送消息,进而也实现数据一致性。
image.png