多个键值对搜索



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

从表中选择 *,其中列 1=?
从表中选择 *,其中 列 2=?和列 3=?
从表中选择 *,其中 column4=? 和 列5=?和列 6=?

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

(列 1) --> 数据 (列 2+列 3) -->


数据 (列
4+列 5) --> 数据

还有其他更好的选择吗?

要点:

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

看起来你想要一个内存中的缓存。Guava有很酷的缓存 - 你需要一个LoadCache。

这是加载缓存的链接

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

所以如果你有三种方法

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

您的三个 LoadCache 将从您编写的加载实现中调用这些方法。仅此而已。我发现它非常干净和简单,得到你想要的东西。

你提到你必须缓存数百万条记录。这是一个相当大的数字。我不建议你构建自己的缓存框架,特别是不要基于简单的数据结构,如HashMaps。我强烈推荐 Redis - 在 http://redis.io 检查。Twitter,Stackoverflow等公司正在使用Redis作为缓存。

这是 Redis 的现场演示 - http://try.redis.io

最新更新