多键值对搜索

Posted

技术标签:

【中文标题】多键值对搜索【英文标题】:Multiple key and value pair search 【发布时间】:2015-07-10 06:44:44 【问题描述】:

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

select * from table where column1=? 从表中选择 * 列 2=?和column3 =? 从表中选择 * column4=?和 第5列=?和 column6=?

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

(column1) --> 数据 (column2+column3) --> 数据 (column4+column5) --> 数据

还有其他更好的选择吗?

要点:

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

【问题讨论】:

与其重新发明查询系统,您是否考虑过像 H2 这样的内存数据库? 您是否考虑过在Hibernate 中使用标准缓存? docs.jboss.org/hibernate/orm/3.3/reference/en/html/…它将解决您的问题并避免缓存实现问题。 【参考方案1】:

看起来你想要一个内存缓存。 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 将从您编写的加载实现中调用这些方法。就是这样。我觉得得到你想要的东西非常干净和简单。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于多键值对搜索的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何快速取出JSON的指定键值?

TP5如何向mongoDB插入一个键值为null!

使用带有 sql 的键值对搜索 php 多维关联数组,例如 '%LIKE%' 构造

在键值对中搜索字符串 [重复]

搜索键值对并将值附加到 unix 中的其他键

插入键值对后在搜索树中增加值