多键值对搜索
Multiple key and value pair search
我们计划在应用程序端缓存数据库 table(以避免调用数据库)。我们的缓存是键值对实现。如果我使用主键(第 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
还有其他更好的选择吗?
要点:
- Table 包含数百万条记录
- 我们正在使用 Java ConcurrentHashMap 实现缓存。
您提到您必须缓存数百万条记录。这是一个很大的数字。我不建议你构建自己的缓存框架,尤其是不要基于简单的数据结构,如 HashMaps。
我强烈推荐 Redis - 检查 http://redis.io。 Twitter、Whosebug 等公司正在使用 Redis 作为他们的缓存。
这里是Redis的现场演示 - http://try.redis.io
您似乎需要一个内存缓存。 Guava 有很酷的缓存——你需要一个 LoadingCache。
这里是link到LoadingCache
基本上,对于您的问题,想法是拥有三个 LoadingCache。 LoadingCache 有一个您应该实现的方法。该方法告诉在给定输入的情况下加载缓存,在缓存未命中的情况下如何获取数据。因此,第一次访问 query1 的加载缓存时,会发生缓存未命中。加载缓存会使用你实现的方法(你的经典DAO方法)来获取数据,把它放在缓存中,然后return给你。下次您访问它时,将从您的内存中的番石榴缓存中提供服务。
所以如果你有三种方法
Data getData(Column1 column)
Data getData(Column2 column2, Column3 column3)
Data getData(Column4 column4, Column5 column5, Column6 column6)
您的三个 LoadingCache 将从您编写的加载实现中调用这些方法。就是这样。我发现得到你想要的东西非常干净和简单。
我们计划在应用程序端缓存数据库 table(以避免调用数据库)。我们的缓存是键值对实现。如果我使用主键(第 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
还有其他更好的选择吗?
要点:
- Table 包含数百万条记录
- 我们正在使用 Java ConcurrentHashMap 实现缓存。
您提到您必须缓存数百万条记录。这是一个很大的数字。我不建议你构建自己的缓存框架,尤其是不要基于简单的数据结构,如 HashMaps。 我强烈推荐 Redis - 检查 http://redis.io。 Twitter、Whosebug 等公司正在使用 Redis 作为他们的缓存。
这里是Redis的现场演示 - http://try.redis.io
您似乎需要一个内存缓存。 Guava 有很酷的缓存——你需要一个 LoadingCache。
这里是link到LoadingCache
基本上,对于您的问题,想法是拥有三个 LoadingCache。 LoadingCache 有一个您应该实现的方法。该方法告诉在给定输入的情况下加载缓存,在缓存未命中的情况下如何获取数据。因此,第一次访问 query1 的加载缓存时,会发生缓存未命中。加载缓存会使用你实现的方法(你的经典DAO方法)来获取数据,把它放在缓存中,然后return给你。下次您访问它时,将从您的内存中的番石榴缓存中提供服务。
所以如果你有三种方法
Data getData(Column1 column)
Data getData(Column2 column2, Column3 column3)
Data getData(Column4 column4, Column5 column5, Column6 column6)
您的三个 LoadingCache 将从您编写的加载实现中调用这些方法。就是这样。我发现得到你想要的东西非常干净和简单。