Java 何时点击数据库而不是搜索列表中的对象
如果我们使用MongoDB(NoSQL)或MySQL(Relational DB)来检索对象,并且我们想要搜索特定元素(where子句),但是我们已经有了一个内存中的列表(LinkedList、ArrayList或其他任何东西),其中包含一些对象,无论是用于缓存还是出于任何其他原因Java 何时点击数据库而不是搜索列表中的对象,java,database,algorithm,Java,Database,Algorithm,如果我们使用MongoDB(NoSQL)或MySQL(Relational DB)来检索对象,并且我们想要搜索特定元素(where子句),但是我们已经有了一个内存中的列表(LinkedList、ArrayList或其他任何东西),其中包含一些对象,无论是用于缓存还是出于任何其他原因 当使用内存中的结构进行检索而不是查询数据库更便宜时,是否有一个公式/库可以提供“建议”?(例如,考虑到内存列表的大小?查询内存缓存总是比较便宜的 唯一的例外是,如果您构建了缓存,因此搜索它的效率非常低(例如,线性搜索
当使用内存中的结构进行检索而不是查询数据库更便宜时,是否有一个公式/库可以提供“建议”?(例如,考虑到内存列表的大小?查询内存缓存总是比较便宜的 唯一的例外是,如果您构建了缓存,因此搜索它的效率非常低(例如,线性搜索)。但只要它是一个基于散列的结构,它最糟糕的情况就是做数据库需要做的事情,但没有网络开销。在哈希表中查找某些内容基本上是免费的
更大的问题是,缓存是否占用了太多内存,以致于应用程序的其余部分无法使用。为了避免这种情况,您需要一个弱哈希映射或类似的映射。如果这是某种ORM生成的缓存,那么它已经被弱引用了。在地图中存储数据会让事情变得更快,如果可能的话。是的,我同意,但在某些情况下,我认为查询数据库会更便宜。我对此表示怀疑。在几乎所有可能的用例中查询内存中的对象都会更快。事实上,有如此多的用例,我怀疑您是否会看到性能的显著提高。我想不出哪种情况下命中磁盘会比读取内存更快。您想访问磁盘的唯一可能原因是您的缓存已过期,需要刷新。即使它包含数百万个对象且没有索引?@salamis如果它是某种哈希表,则是。但是如果它在哈希表中,则它有一个索引@salamis指出,他可用的数据结构没有索引。如果我有一个名、姓、出生日期、id的person对象,最好创建一个哈希表,索引中包含名、姓、id的组合,例如?并查询哈希表而不是查询数据库?如果您能够在不再次查询数据库的情况下复制相同的键,则是。