java - Groovy:以 Maps 作为键的 MultiValueMap

标签 java data-structures groovy apache-commons multivalue

这是我正在考虑做的事情,我想知道您是否认为这是一个好主意。

我从数据库中检索了一堆行,在 groovy 中它为我提供了一个列表列表,如下所示:

[
  [ 'Dog', 'M', 'Mutt', 'Sammy' ],
  [ 'Cat', 'F', 'Siamese', 'Pat' ],
  [ 'Dog', 'M', 'Husky', 'Taco' ],
  ...
]

不是我的真实数据集,但你明白了。

由于我会非常频繁地提取这些数据,并在将其呈现在 UI 中之前对其进行一些分析,因此我想将其存储在 MultiValueMap 中。由常规映射(即 LinkedHashMaps)作为键控,因此我可以检索我需要的部分内容,而无需每次都去数据库。它是来自多个表的数据子集的缓存(比上面的动物数据更复杂)。

我可以像这样使用它:

animals.get([species:'Dog', gender:'M'])

返回:

[['Sammy', 'Mutt'], ['Taco', 'Husky'] ]

我想我知道如何实现它,所以我并不是真的在寻找它(尽管如果您有新颖的建议,请分享)。我主要是想找人告诉我,要么由于某种原因这不起作用,要么听起来不错,要么无法扩展,等等。或者也许有一些更简单的方法来获得类似的功能。还有一个考虑因素:整个数据集有时可能会很大,例如很少有 100k 条记录。如果不是这样,除了每次都点击数据库之外,还有什么好方法来处理它?<​​/p>

我意识到周围有很多键/值缓存解决方案,但我认为我不需要任何如此繁重的任务来完成我正在做的事情。它只是一个使用率很低的小型网络应用程序,主要是我为其构建的公司内部的。

最佳答案

如果您使用的值的子集是静态/确定性的,我只需将其转换为字符串并将其用作映射中的键。因此,我不会使用 animals.get([species:'Dog', sex:'M']),而是使用 animals.get('species:Dog:gender:M') .

我知道您说过您认为键值存储过于重量级,但这也是 Redis 的完美用例,它可以 natively store things like hash maps .

您所说的存储类型正是我们在我工作的生产环境中使用它的方式,而且非常棒。它非常快,并且可以供所有正在运行的进程使用,而无需拥有单个或非常大的映射的多个副本。缓存失效也是您需要考虑的问题,redis 可以帮助解决。

您可以使用grails-redis plugin记住您的数据库调用,以便它首先自动检查redis以查看它是否在缓存中,如果不在,它会查询数据库并将其粘贴到缓存中,然后再返回。请参阅docs on github了解更多详细信息/示例。

return redisService.memoizeHash('species:Dog:gender:M') {
    // database call that returns object, then you turn that into hash
    Dog d = Dog.findBy...
    [species: d.species, gender: d.gender, breed: d.breed, name: d.name, ...]
}

这样,仅当 Redis 缓存中尚未有数据库时,它才会查询数据库。当缓存未命中时,它将返回值保存在 Redis 中的指定键处。

(免责声明,我是 grails-redis plugin 的作者,所以我有一些偏见)

关于java - Groovy:以 Maps 作为键的 MultiValueMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7101244/

相关文章:

eclipse - 我可以使用 Groovy 编写 Eclipse 插件吗?

java - 查找 mysql 查询是否执行了更新或插入

algorithm - 是否可以在 O(n) 步内从 Max-Heap 构建二叉搜索树?

java - 为什么在这里调用父类(super class)方法?

php - Golang 常量结构键

python - 在 Python 中获取 DictReader 标题的特殊情况

java - Groovy 脚本性能包含与匹配

groovy - 如何调试 intellij gdsl 文件?

java.lang.UnsatisfiedLinkError : "no swt-win32-4623" running Visualization Customizer

java - 如何添加在两列之间动态平均分配的组件?