java - 多键值对搜索

标签 java algorithm caching data-structures

我们计划在应用程序端缓存数据库表(以避免数据库调用)。我们的缓存是键值对实现。如果我使用主键(第 1 列)作为键,所有其他数据作为值,我们如何针对缓存执行以下查询?

select * from table where column1=?
select * from table where column2=? and column3=?
select * from table where column4=? and column5=? and column6=?

一个最简单的选择是构建 3 个缓存,如下所示。

(column1) --> Data
(column2+column3) --> Data
(column4+column5) --> Data

还有其他更好的选择吗?

要点:

  • 表包含数百万条记录
  • 我们使用 Java ConcurrentHashMap 实现缓存。

最佳答案

看起来你想要一个内存缓存。 Guava 有很酷的缓存——你需要一个 LoadingCache。

这是 LoadingCache 的链接

基本上,对于您的问题,想法是拥有三个 LoadingCache。 LoadingCache 有一个您应该实现的方法。该方法告诉在给定输入的情况下加载缓存,在缓存未命中的情况下如何获取数据。因此,第一次访问 query1 的加载缓存时,会发生缓存未命中。加载缓存将使用您实现的方法(您的经典 DAO 方法)获取数据,将其放入缓存中,然后返回给您。下次您访问它时,它将从您的内存中 Guava 缓存提供服务。

所以如果你有三种方法

Data getData(Column1 column)
Data getData(Column2 column2, Column3 column3)
Data getData(Column4 column4, Column5 column5, Column6 column6)

您的三个 LoadingCache 将从您编写的加载实现中调用这些方法。就是这样。我发现获得您想要的东西非常干净和简单。

关于java - 多键值对搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29969858/

相关文章:

java - 在多个对象之间创建其他人可以搜索的松散关系

Java如何检查二维数组中的一行是否为空。

algorithm - 为什么 Merge Sort 的 Merge() 函数有条件第二个循环?

algorithm - 我对有向加权图中心概念的理解正确吗?

java - 如何从 Recycler View onClick 缓存 WebView Activity 的多个 URL

类似Android浏览器的实现,我在哪里缓存图像

java - 从密码重新生成私钥

java - Java 中数组的模式 - 方法

java - 如何动态追加新行到多行 TextView

java - 无法在 Java 中使用 cachingHttpClient 缓存 HttpResponse?