spring-boot - Spring缓存实现
问题描述
我正在探索弹簧缓存设施。我对此几乎没有疑问。
首先,它应该应用在服务方法级别还是DAO方法级别,其中服务方法正在调用DAO方法。
其次,我应该如何避免缓存数据过时?
解决方案
IMO,这两个问题的答案都是“视情况而定”。
从技术上讲,Spring Wise,在 Service 和 DAO 上应用的缓存注释都可以工作,我认为没有任何区别,所以归结为具体的用例。
例如,如果您“逻辑上”计划提供一个可缓存的抽象,该抽象应作为在服务器上完成的某些计算过程的结果而计算,您最好在服务级别使用缓存。
另一方面,如果您有一个类似于Something getSomethingById(id)
dao 的 DAO 方法,并且您希望避免对底层数据库进行相对昂贵的调用,则可以在 DAO 级别提供缓存。话虽如此,如果您有类似List<Something> fetchAll()
or的方法,应用缓存可能没有用List<Something> fetchAllByFilter()
。如果您正在使用 JPA(使用 Hibernate 实现),他们有自己的缓存抽象,但它有点超出了问题的范围,只是您应该注意的事情......
互联网上有很多可用的教程,一些说明基于服务的方法,一些使用 DAO 的方法注释,但同样,这些只是简单的例子,在现实世界中你必须做出决定。
现在关于第二个问题。一般来说,如果您的数据变化不大,那么缓存是有意义的,所以首先如果它经常变化,那么缓存可能不适合/不适合用例。
除此之外,还有很多技巧:
- 缓存数据驱逐(通常基于时间)。看这个教程
- 某种消息系统将发送有关缓存条目更改的消息。如果您有一个分布式应用程序并且仅将缓存保留在内存中,则此选项特别有用。收到消息时,您可能会选择“缓存复制”或完全清除缓存,以便最终“填充”新数据
- 使用 Hazelcast 或 Redis 等分布式缓存技术,而不是内存缓存。因此,从技术上讲,缓存提供者将保证缓存数据的一致性。
我还想向您推荐本教程-演讲者讨论了缓存实现的不同方面,我认为它与您的问题确实相关。
推荐阅读
- java - HashMap 包含某个键,但告诉我它没有
- c - 使用scanf时获得无限运行程序
- python - 根据列表中的值过滤数据框
- sql-server - 在 Visual Studio 中使用实体框架与 SQL Server 的连接问题
- three.js - A-Frame中相机和物体之间的碰撞
- ios - 从 AppDelegate Swift 4 更新 tableView 行
- python - 重复使用后关闭数据库连接
- java - RxJava:从内部嵌套循环返回结果
- kotlin - 通过 Jackson 对 Either 进行反序列化
- gradle - JHipster - 无法在 gradle build 上使用 liquibase 连接到 dev postgres DB