首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多键和值对搜索

多键和值对搜索
EN

Stack Overflow用户
提问于 2015-04-30 14:01:50
回答 2查看 175关注 0票数 1

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

从表中选择* column1=在哪里? 从表中选择* column2=在哪里?column3=呢? 从表中选择* column4=在哪里?column5=呢?column6=呢?

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

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

还有其他更好的选择吗?

关键点:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-01 00:31:12

看来你想要一个内存缓存。番石榴有很酷的缓存--你需要一个LoadingCache。

下面是指向LoadingCache的链接

基本上,对于您的问题,想法是有三个LoadingCache。LoadingCache有一个应该实现的方法。该方法告诉加载给定输入的缓存,如何在缓存丢失的情况下获取数据。因此,当您第一次访问query1的加载缓存时,就会出现缓存丢失。加载缓存将使用您实现的方法(经典的DAO方法)获取数据,将其放入缓存,并将其返回给您。下次您访问它时,它将从内存中的番石榴缓存中得到服务。

所以如果你有三种方法

代码语言:javascript
复制
Data getData(Column1 column)
Data getData(Column2 column2, Column3 column3)
Data getData(Column4 column4, Column5 column5, Column6 column6)

您的三个LoadingCache将从您编写的load实现中调用这些方法。就是这样。我发现得到你想要的东西既干净又简单。

票数 1
EN

Stack Overflow用户

发布于 2015-04-30 14:07:43

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29969858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档