0

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

  • 控制器:字符串
  • 动作:字符串
  • 参数:数组

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

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 }
}

示例代码(工作正常):

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

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

JCache<String, byte[]> cache = ...
String key = "/category/list/1";
cache.put(key, bytesContent);

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

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

4

1 回答 1

1

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

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

=> 所以我会推荐使用,String因为它有更多的优势。

注意:在其他具有复杂值类型的语言中,使用仅由您的 String 组成但提供额外类型安全性以及(分解)其组件的方法的值类型将是另一种更好的选择。

于 2018-06-12T16:30:03.533 回答