首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JCache字符串键与复合键

Java JCache字符串键与复合键
EN

Stack Overflow用户
提问于 2018-06-12 15:51:59
回答 1查看 364关注 0票数 0

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

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

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

代码语言:javascript
复制
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 }
}

样本代码(工作正常):

代码语言:javascript
复制
JCache<ResponseKey, byte[]> cache = ...
ResponseKey key = new ResponseKey("category", "list", new Object[] { 1 });
cache.put(key, bytesContent);

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

代码语言:javascript
复制
JCache<String, byte[]> cache = ...
String key = "/category/list/1";
cache.put(key, bytesContent);

因为用于序列化/反序列化的字符串类型比ResponseKey类型轻。

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

EN

回答 1

Stack Overflow用户

发布于 2018-06-12 16:30:03

这个问题可能没有确切的答案,因为每一种方法都有优缺点。两者都会起作用的。

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

因此,我建议使用String =>,因为它有更多的优点。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50821254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档