Java JCache字符串键与复合键

时间:2018-06-12 15:52:00

标签: java java-ee-7 distributed-caching jcache

我正在使用JCache来缓存Web响应。缓存键包括以下字段:

  • controller:String
  • action:String
  • 参数:数组

我创建了ResponseKey类并将其用作缓存键类型:

WHERE id in (select id from mytable where status='green' and rownum<=10 order by impact desc )

示例代码(工作正常):

public class ResponseKey implements Serializable {

    private String controller;
    private String action;
    private Object[] parameters;

    @Override
    public int hashCode() { // IMPL }

    @Override
    public boolean equals(Object obj) { // IMPL }
}

另一种方法是使用String作为缓存密钥类型:

JCache<ResponseKey, byte[]> cache = ...
ResponseKey key = new ResponseKey("category", "list", new Object[] { 1 });
cache.put(key, bytesContent);

由于String类型比ResponseKey类型更轻,因为序列化/反序列化。

我的问题是:我应该使用String键而不是ResponseKey键吗?

1 个答案:

答案 0 :(得分:1)

这个问题可能没有确切的答案,因为每种方式都有利弊。两者都有效。

  • - &GT; 字符串:如果具有完全不同的参数集的不同缓存项,则密钥类的灵活性会降低。
  • - &GT; 字符串:密钥类在缓存查找时有更多开销,因为您可能带有一个URL,并且在使用String时如果出现缓存命中则无需解析整个URL。
  • - &GT; 密钥类:从代码中可以更清楚地知道什么是用作密钥,它提供了更多的类型安全性。例如。你不能错过/
  • - &GT; 字符串:每个键的字符串都有一个对象的开销,而您的密钥类大约需要5个或更多。
    但请注意,这可能会变成相反的情况 非常使用动作,控制器甚至参数值 经常。在这种情况下,不同的密钥实例可以共享 selfsame 动作的字符串等。这可能会节省大量内存 当许多项目被缓存时。但是,缓存内容很可能会大得多,因此除非重复数据删除也适用于您的缓存内容,否则这通常不会带来重量。

=&GT;所以我建议使用String ,因为它有更多的优势。

注意:在具有复杂值类型的其他语言中,还有另一个更好的选择,即使用仅包含String的值类型,但提供其他类型安全性以及(de)组成其组件的方法。