Spring Boot с кешированием Redis не работает должным образом в среде DockerJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Boot с кешированием Redis не работает должным образом в среде Docker

Сообщение Anonymous »

У меня возникла проблема с моим приложением Spring Boot, использующим Redis для кэширования при работе в среде Docker. Вот ситуация:
  • Настройка проекта:
    • Spring Boot и Java приложение с Redis для кэширования.
    • ТТЛ кэша установлен на 10 минут.
    • Использование Docker Compose для запуска приложения Redis.
  • Поведение:
    • При работе в IntelliJ IDEA:

      Приложение работает как положено
    • База данных запрашивается только один раз, затем используется кеш
    • При работе в Docker:

      Приложение работает значительно медленнее
    • Журналы показывают частые запросы к базе данных
  • При ручном тестировании с помощью Postman по одному запросу к среде Docker:
    • Похоже, что кеширование Redis работает правильно
  • Соответствующий код:
Конфигурация Redis:

Код: Выделить всё

@Configuration
public class RedisConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10L))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

return RedisCacheManager
.builder(connectionFactory)
.cacheDefaults(cacheConfig)
.transactionAware()
.build();
}
}
Кэшированный метод:

Код: Выделить всё

@Cacheable(cacheNames = "userCache", key = "#id + ':profile'", cacheManager = "cacheManager")
@Transactional(readOnly = true)
public UserResponse getUserProfile(Long id) {
log.debug("getUserProfile method called with id: {}", id);
User findUser = userRepository.findById(id)
.orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND));
return UserResponse.builder()
.nickname(findUser.getNickname())
.email(findUser.getEmail())
.role(findUser.getRole().name())
.picture(findUser.getPicture())
.build();
}
application.yml:

Код: Выделить всё

spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.H2Dialect
format_sql: true
data:
redis:
host: redis
port: 6379
profiles:
include: oauth

logging.level:
org.hibernate.SQL: debug
com.yoonji.dockermaster: debug
Docker Compose:

Код: Выделить всё

version: "3"
services:
redis:
container_name: redis
image: redis:alpine
ports:
- 6379:6379
volumes:
- ./data/:/data
app:
build:
context: .
dockerfile: Dockerfile
container_name: dockermaster
ports:
- 8080:8080
depends_on:
- redis
  • Вопрос:
Что может быть причиной такого кэширования проблема в среде Docker и как ее решить, чтобы кэш работал должным образом для всех сценариев, а не только при выполнении отдельных запросов?
Если есть какой-либо дополнительный код или подробности, связанные с вашей проблемой, которые вы хотите, чтобы я проверил, дайте мне знать. Поскольку я впервые использую Docker, буду признателен за более подробные инструкции.
Буду очень признателен за любую помощь или идеи. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/790 ... nvironment
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»