一文讲解Redis中和本地缓存之间的一致性问题及区别等
一文讲解Redis中和本地缓存之间的一致性问题及区别等
在我做的项目中,为了减轻 Redis 的负载,我追加了一层本地缓存 Caffeine。
为了保证本地缓存和 Redis 缓存的一致性,通常采用的策略有:
①、设置本地缓存的过期时间,这是最简单也是最直接的方法,当本地缓存过期时,就从 Redis 缓存中去同步。
②、使用 Redis 的 Pub/Sub 机制,当 Redis 缓存发生变化时,发布一个消息,本地缓存订阅这个消息,然后删除对应的本地缓存。
③、Redis 缓存发生变化时,引入消息队列,比如 RocketMQ、RabbitMQ 去更新本地缓存。
由于技术派本身对缓存的一致性要求不是特别高,所以我就采用第一种方式。
另外,在技术派实战项目中,我对缓存的使用场景做了细化。比如说,使用 CacheBuilder 来完成 Guava Cache 的构建,像一些简单的缓存场景,比如说获取菜单分类、获取登录验证码、获取用户转存图片等,都使用了 Guava Cache。
像首页侧边栏、专栏侧边栏、文章详情侧边栏等缓存场景,就使用了 Caffeine 作为本地缓存,通过 @Cacheable、@CacheEvit、@CachePut 等注解实现,非常轻巧。
而像用户 Session 和网站地图 SiteMap 等缓存场景,就使用了 Redis 来作为缓存。
如果在项目中多个地方都要使用到二级缓存的逻辑,如何设计这一块?
在设计时,应该清楚地区分何时使用一级缓存和何时使用二级缓存。通常情况下,对于频繁访问但不经常更改的数据,可以放在本地缓存中以提供最快的访问速度。而对于需要共享或者一致性要求较高的数据,应当放在一级缓存中。
本地缓存和 Redis 缓存的区别和效率对比?
Redis 可以部署在多个节点上,支持数据分片,适用于跨服务器的缓存共享。而本地缓存只能在单个服务器上使用。
Redis 还可以持久化数据,支持数据备份和恢复,适用于对数据安全性要求较高的场景。并且支持发布/订阅、事务、Lua 脚本等高级功能。
效率上,Redis 和本地缓存都是存储在内存中,读写速度都非常快。