问题设置
- 实体到达进行处理,并执行一系列步骤,这些步骤对这些实体以及可能对其他相关实体进行操作并生成一些结果;
- 某些实体需要实时处理,无需访问任何数据库;
- 目前的实现只是在数据库中查找实体,没有任何缓存。
优化时间:-)
可能的方法
简单缓存
简单的内存缓存有两个缺陷:
- 它可能会溢出,因为我们正在讨论大量实体;
- 它不保证在缓存中找到所需的实体,并且无法查询其可用性或被要求“预加载”自身。
所以这是不行的。
实体分析+预加载
我正在考虑构建某种分析器来找出给定实体需要检索哪些数据(即使是大型形式),并向缓存发出请求以带外加载所需的数据。
步骤是:
- 实体到达。如果需要在内存中处理,则发送缓存加载请求;
- 实体被放置在缓存等待队列中,直到收到缓存加载的响应。如果数据可用,这可能会立即发生;
- 实体被发送进行处理并使用加载的数据;
- 缓存已清除。这确实有可能清除政策,但我目前并不担心这些。
问题
您对这种方法有何看法?我是否缺少一些可以在这种情况下应用的众所周知的数据访问模式?
<小时/>更新 1:忘记提及整个处理是单线程的,这确实极大地限制了选项。
最佳答案
你说:
A simple in-memory cache has 2 flaws:
- it may overflow, since we are talking about a large number of entities
- it does not guarantee that the required entities are found in the cache, and it has no way of being queried about the availability or being asked to "preload" itself.
也许我完全误解了您的问题和需求,但这在很多层面上听起来都是不正确的:
- 许多缓存解决方案允许您定义可以在缓存中存储的元素的最大数量。一旦达到最大大小,就可以按照先进先出策略或根据最近最少使用的原则删除项目。
- 缓存不应该“保证在缓存中找到所需的实体”;这不是缓存的目的。
- 大多数缓存解决方案的 API 确实允许您检查缓存中是否存在 key (事实上,如果您使用
Map
构建自己的解决方案,您仍然可以执行此操作... )。 - Ehcache 有 self-populating caches ,它可用于允许您在需要开始检索项目之前预先填充缓存 ( another link here )。
关于java - 检索数据时保证缓存命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944265/