java - 使用缓存作为数据库前面的一层
问题描述
我正在开发一些本质上是异步的后端服务。也就是说,我们有多个异步运行的作业,并将结果写入某个记录。
该记录基本上是一个包装HashMap
结果的类(键是job_id
)。
问题是,我不想提前计算或知道要运行多少作业(如果我知道,我可以cache.invalidate()
在所有作业都已经完成时打开钥匙)
相反,我想要以下方案:
- 为新记录设置到期时间(即
expireAfterWrite
) - 到期时,将(实际上
upsert
)记录写入数据库 - 如果发生缓存未命中,
load()
则调用从数据库中获取记录(如果未找到,则创建一个新记录)
问题: 我尝试使用 Caffeine 缓存,但问题是记录没有在预期的确切时间过期。然后我阅读了这个关于 Guava's Cache 的SO 答案,我想类似的机制也适用于咖啡因。
所以问题是一个记录可以在缓存中“等待”很长一段时间,即使它已经完成了。有没有办法克服这个问题?也就是说,有没有办法“鼓励”缓存使过期项目无效?
这导致我质疑我的解决方案。你会认为我的解决方案是一个好习惯吗?
PS 如有必要,我愿意切换到其他缓存解决方案。
解决方案
您可以通过 write-behind 查看 Ehcache。这肯定是更多的设置工作,但它工作得很好
推荐阅读
- php - 如何通过href将Span id值传递到另一个页面
- installation - 高级安装程序如何检查安装目录是否为空
- c++ - 无法使用 Code::Blocks (20.03) 在 C++ 中构建 hello world,操作系统:Linux
- ios - 向 Xcode 项目添加“访问 wifi 信息功能”的问题
- c++ - 有很多成员的班级
- python - 在 groupby Python 之后查找配对记录
- firebase - 如何在颤振中使用 sharedPreference 以使用 setBool 和 GetBool 保持用户在颤振中登录
- permissions - 没有权限使用 psql 的 root
- javascript - 防止对可缓存响应的重复 HTTP 请求
- docker - docker-compose & Dockerfile:添加失败:未指定源文件