java - 缓存键生成

标签 java caching groovy ehcache

我正在使用 ehcache(通过 Grails 插件)。将对象添加到缓存的方法要求键是可序列化的,因此典型的用法是:

def key = 22
def someObject = new Object();
cacheService.cache(key, true, someObject)

( boolean 参数表示对象应该被添加到分布式缓存还是本地缓存)

我的问题是我应该如何从值对象生成键,例如:

class Person implements Serializable {
  String firstName
  String lastName
  Integer age
}

一种方法是提供 hashCode() 和 equals() 方法并使用 hashCode 作为键。在这种情况下,我不需要让 Person 类实现 Serializable。

或者,我可以简单地使用 Person 对象本身作为键。看起来我仍然需要提供 equals 和 hashCode 方法,但还需要实现 Serializable。但是,使用这种方法发生冲突的可能性似乎较小,因为一个 Person 只能等于另一个 Person 实例。

我假设 ehcache 使用一个键的 equals() 方法来确定该键是否已经存在于缓存中,这个假设是否正确?

上面列出的任何一种方法在本质上都比另一种更好,还是有另一种我没有考虑过的方法?

谢谢, 唐

最佳答案

您的散列键问题大部分与可序列化问题正交。作为哈希键的答案,我会使用 Apache Commons HashCodeBuilder。它为您完成所有繁重的工作。与 equals 类似,使用 EqualsBuilder。

不过请记住,哈希码需要在对象的整个生命周期内保持不变,因此只对那些不会改变的内部元素进行哈希处理。

我会避免使用 Person 对象作为键,因为它会调用 equals() 来检查键比较,这可能比比较整数哈希码慢。

关于java - 缓存键生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1407523/

相关文章:

java - 将字符串转换为日期然后格式化日期

java - 实时服务器 CPU 使用率高时的线程转储分析

ios - 在 iOS 应用程序中缓存任意数据的最合适方法是什么?

testing - 我如何重用测试的某些部分?

plugins - Grails CSV插件,CSVWriter示例不起作用

java - 需要帮助向学生解释概念

java - Java 中的嵌入式/ headless 浏览器,支持自定义 DOM 事件或注入(inject) javascript

ruby - 缓存获取的网页有哪些选项?

google-apps-script - 在 UrlFetchApp 中缓存

ruby - Grails上的Cuke4Duke