Строковый ключ Java JCache против составного ключа - PullRequest
0 голосов
/ 12 июня 2018

Я использую JCache для кэширования веб-ответов.Ключ кэша содержит следующие поля:

  • контроллер: строка
  • действие: строка
  • параметры: массив

Iсоздал класс 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ключ?

1 Ответ

0 голосов
/ 12 июня 2018

Вероятно, нет точного ответа на этот вопрос, так как есть плюсы и минусы для каждого пути.Оба будут работать.

  • -> String : класс ключей менее гибок в случае использования различных элементов кэша с совершенно разными наборами параметров.
  • -> String : Ключевой класс имеет больше накладных расходов при поиске в кэше, поскольку вы, вероятно, получаете URL-адрес, и нет необходимости анализировать весь URL-адрес в случае попадания в кэш при использовании String.
  • -> Класс ключей : из кода более ясно, что предполагается использовать в качестве ключа, и это обеспечивает большую безопасность типов.Например, вы не можете случайно пропустить /.
  • -> String : строка имеет издержки один объект на ключ, в то время как ваш класс ключей занимает около5 или большеНо имейте в виду, что это может превратиться в противоположность, когда одни и те же действия, контроллеры и, возможно, даже значения параметров используются очень часто.В этом случае разные ключевые экземпляры могут совместно использовать строку selfsame для действий и так далее.Это может сохранить значительную память, когда многие элементы кэшируются.Однако, скорее всего, содержимое кэша будет гораздо больше, поэтому обычно оно не имеет веса, если дедупликация также не применяется к вашему содержимому в кэше.

=>, поэтому Я бы порекомендовал использовать String, поскольку он имеет больше преимуществ.

Примечание: в других языках со сложными типами значений был бы другой предпочтительный вариант использования типа значения, который состоит только из вашей String, но обеспечивает дополнительную безопасность типов, а такжеметоды (де) составления его компонентов.

...