Эта статья посвящена интеграции Spring-boot и Redis с использованием spring-data-redis. Spring Data Redis – это абстракции платформы Spring Data для Красный – это популярное хранилище структур данных в памяти. Полный исходный код этого проекта доступен на GitHub . Давайте сразу перейдем к делу.
Я предполагаю, что вы уже знакомы с spring boot и redis и выбрали redis в качестве хранилища кэша для своего проекта.
В некоторых сценариях, когда нам приходится иметь дело с многопользовательским приложением или мы хотим кэшировать данные нескольких пользователей в Redis, тогда, чтобы избежать конфликтов данных и улучшить архитектуру приложений, мы можем воспользоваться сервисом преобразования данных spring redis.
Приведенная ниже логика хороша, когда нам нужно сохранить данные, которые являются общими для всех пользователей.
String cacheKey = "user-data";
Cache cache = cacheManager.getCache(cacheKey);
Cache.ValueWrapper result = cache != null ? cache.get(cacheKey) : null;
if(result.get()!=null){
// get the data and proceed
}else{
cache.put(cacheKey, userData);
}
Но что, если, когда вы захотите сохранить отдельные пользовательские данные, вышеприведенная логика не сработает. Затем мы можем использовать службу преобразования с пользовательским конвертером ключей, который позволяет нам добавлять динамический префикс к пользовательским данным, таким как идентификатор пользователя.
# Шаги по интеграции spring data redis
- добавьте следующие зависимости в свой файл build.gradle или, если это maven, то в pom.xml
группа компиляции: “org.springframework.data”, название: “spring-data-redis”, версия: “2.1.5.РЕЛИЗ” группа компиляции: ‘org.apache.commons’, имя: ‘commons-pool2’, версия: ‘2.0’ группа компиляции: ‘redis.клиенты’, имя: ‘jedis’, версия: ‘2.9.3’
- Создайте пользовательский ключ и класс конвертера, например.
@AllArgsConstructor
public class UserCacheKey {
private String key;
}
Аннотации @Getter и @AllArgsConstructor являются частью проекта Lombok, о котором мы можем рассказать в другой статье. Если вы не знаете о Lombok, добавьте методы и конструктор сеттера-геттера по умолчанию с ключевым аргументом.
public class UserCacheKeyConverter implements Converter{ private UserServive userService; public UserCacheKeyConverter(UserServive userService) { this.userService = userService; } @Nullable @Override public String convert(UserCacheKey userCacheKey) { String userId = userService.getUserId(userCacheKey); return String.format("%s_%s", userId , userCacheKey.getKey()); } }
- Создайте файл конфигурации Redis.
@Bean(name = "userCacheManager")
public RedisCacheManager userCacheManager(RedisConnectionFactory
connectionFactory, UserService userService) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
DefaultFormattingConversionService conversionService = (DefaultFormattingConversionService) redisCacheConfiguration.getConversionService();
conversionService.addConverter(UserCacheKey.class, String.class, new UserCacheKeyConverter(userService));
redisCacheConfiguration
.entryTtl(Duration.ofSeconds(1800)).withConversionService(conversionService)
.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(redisCacheConfiguration)
.withInitialCacheConfigurations(Collections.singletonMap("user-cache", redisCacheConfiguration))
.build();
}
итак, здесь мы создаем RedisCacheManager, который будет обрабатывать только операции, связанные с пользовательским кэшем. В любом месте мы можем ввести этот RedisCacheManager в качестве именованного компонента userCacheManager (@Квалификатор(userCacheManager)) и выполнить соответствующие операции, такие как
Cache cache = userCacheManager.getCache("user-cache");
UserCacheKey cacheKey = new UserCacheKey("some-user-data");
Cache.ValueWrapper result = cache != null ? cache.get(cacheKey) : null;
if(result.get()!=null){
// get the data and proceed
}else{
cache.put(cacheKey, userData);
}
Поэтому всякий раз, когда вы сначала вызываете метод cache.get, он вызывает конвертер кэша и преобразует ключ. Это поможет нам абстрагировать логику кэша и снизить сложность.
Если вы нашли это полезным или хотели бы поболтать о чем-либо, связанном с веб- или мобильной разработкой, оставьте комментарий ниже. Я бы с удовольствием это обсудил. Следите за обновлениями для получения дополнительной информации.
Оригинал: “https://dev.to/tech_sam/spring-boot-with-redis-conversion-service-and-custom-key-converter-5fk9”