【问题标题】:Hazelcast: How to use a List as key in hazelcastHazelcast:如何在 hazelcast 中使用列表作为键
【发布时间】:2016-05-05 20:11:43
【问题描述】:

当我的 java 服务启动时,我从数据库中获取字符串列表,因此会将它们缓存在 hazelcast 中,键是字符串列表和值(例如)100。可能有多个具有不同值的列表。这个想法是,下次当我的方法接收到 String 作为参数时,我应该能够在 hazelcast 中查找它并返回值。

例如:

// These lists are populated from database
List<String> list_1 = new ArrayList<>();
list_1.add("A");
list_1.add("B");

List<String> list_2 = new ArrayList<>();
list_2.add("C");
list_2.add("D");

hazelcast.put("CACHE_KEY_1", list_1, 111);
hazelcast.put("CACHE_KEY_2", list_2, 222);

因此,当我的方法接收“C”作为参数时,hazelcast 应该能够检索该值,即

int value = hazelcast.get("CACHE_KEY_2", "C"); // should return 222

我尝试在文档中查找此功能,但对实现此功能一无所知。

任何指针都会很有帮助。

谢谢, 拉胡尔

【问题讨论】:

    标签: java caching hazelcast


    【解决方案1】:

    如果要将任意字符串列表的值放入缓存中,并且您有两个或多个不同的字符串列表,则需要将列表名称和字符串组合成一个键(称为组合键) ,例如:

     for (String s : list_2) {
       cache.put("CACHE_KEY_2;" + s, 222);
     }
    

    所以现在你可以询问缓存,列表 2 是否包含字符串 'C' 并返回相关的整数值:

     cache.get("CACHE_KEY_2;C");
    

    除了使用组合键之外,您还可以使用两个单独的缓存。这是更好的选择,如果数据本质上非常不同(不同的大小、不同的访问模式、到期时间等)

    顺便说一句:由于键必须是唯一的,因此它不是列表而是集合。

    除了为组合键附加两个字符串外,您还可以为此构造一个对象,其中包含两个元素作为字段并定义适当的 equals() 和 hashCode() 方法。

    【讨论】:

    • 我看到您正在通过执行 list_2.get(1) 保存单个元素。但是我需要将整个列表保存为键。
    • 为什么?您要求此作为检索:hazelcast.get("CACHE_KEY_2", "C"); // should return 222您的检索请求中没有列表。
    • 也许你可以编辑你的问题?!填充完成后,您需要如何访问数据?为什么需要缓存?谁在重新填充缓存条目被驱逐或过期?
    • 感谢您的回复。 Myabe 我的问题不够清楚。我正在从数据库中检索字符串列表,这是一项昂贵的操作。现在我将这些在 hazelcast 中保存为 Key 和与此列表关联的值。该值对于列表中的所有元素都是相同的。现在下一次对于给定的字符串,我应该能够在 hazelcast 中执行查找,如果该字符串存在于键列表中,那么它应该返回与该列表关联的值。
    • 是的,那么这正是解决方案。我更新了答案。
    【解决方案2】:

    为密钥创建一个新类:

    class Key {
      private String category;
      private String listItem;
      ...
    }
    

    保存到 hazelcast:

    for(String listItem: list) {
      hazelcast.put(new Key("CACHE_KEY_2", listItem), 222);
    }
    

    获取:

    assertEquals(222, hazelcast.get(new Key("CACHE_KEY_2", "C"))); 
    

    【讨论】:

    • 感谢您的回复。但是我不想遍历每个元素并将其保存在缓存中。在某些情况下,列表可能很大。我认为 hazelcast 必须有一些东西可以将整个列表保存为键,然后使用谓词,hazelcast 应该能够提取键列表中存在的给定字符串的值。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多