Есть ли лучший способ реализовать Redis в качестве кэша для различных приложений в кластерной среде - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать сервер Redis в качестве кэша. Из-за требований я обязан соблюдать некоторые ограничения: -

  1. Базовые конфигурации XML вместо аннотаций.
  2. Использование библиотеки Jedis для выполнения операций, связанных с кэшированием, таких как выборка всех объектов кэша, выборка одного объекта кэша, удаление всех объектов кэша, сохранение всех объектов кэша, сохранение одного объекта кэша и т. Д.
  3. Ключ кэша будет объектом, а значения - объектом или списком объектов.

Следуя ограничениям, я провел много исследований и смог достичь желаемых результатов.

  1. Я создал bean-компонент с использованием конфигураций xml, который имеет 2 аргумента конструктора. (имя кэша, ссылка на пул джедаев)
  2. В другом определении бина для вышеуказанного пула джедаев (redis.clients.jedis.JedisPool) я поместил хост и порт (там, где работает сервер redis) в качестве аргументов конструктора для класса пула джедаев.
  3. убедитесь, что сервер Redis работает.
  4. сборка и развертывание приложения.
  5. Теперь написано несколько методов для выполнения действий, связанных с кэшированием, как упомянуто выше.

    а) сохранить все объекты кэша, сохранить один объект кэша: - Использовал метод hset для jedispool, передавая 3 аргумента - имя кэша в виде байтового массива, байтовый массив ключа кэша после сериализации объекта ключа в виде байтового массива, байтовый массив значения кэша после сериализации объекта значения в виде байтового массива. (сохранить все будет сделано с помощью вызова save in loop)

    б) получить все объекты кеша, получить один объект кеша: - использовал метод hgetAll класса jedispool, передавая имя кэша в виде байтового массива. и метод hget класса jedispool, передавая имя кэша как байтовый массив и объект ключа кэша как байтовый массив.

    в) для удаления объекта кэша: - вызовите метод jdelispool hdel, передавая, передавая имя кэша как байтовый массив и объект ключа кэша как байтовый массив.

    redis.clients Jedis 2.6.2

    публичный синхронизированный void put (ключ ключа, объектный объект) выдает исключение {

        jedisPool.hset("cache-name-one", methodToSerializeKey(key), methodToSerializeObject(object));
    }
    

    Публичная синхронизация void remove (Key key) создает исключение {

        jedisPool.hdel("cache-name-one", methodToSerializeKey(key));
    
    }
    

    публичный синхронизированный объект get (Key key) выдает исключение {

        return methodToDeserialize(jedisPool.hget("cache-name-one", methodToSerializeKey(key)));
    }
    

Вся описанная выше реализация работает нормально. Хотелось бы узнать, можно ли что-нибудь улучшить здесь.

Также у нас будет несколько сохраненных кеш-объектов, например «cache-name-two, cache-name-three». Как я читал в одной из статей, лучший подход - запускать экземпляр redis на разных портах на одном сервере.

В этом сценарии это тоже будет работать, я верю.

Также, насколько я понимаю, мне не нужно возвращать экземпляр redisPool после каждой операции, так как он создается один раз в грани инициализации компонента.

...