- Настройка проекта:
- Spring Boot и Java приложение с Redis для кэширования.
- ТТЛ кэша установлен на 10 минут.
- Использование Docker Compose для запуска приложения, Redis и базы данных H2.
- Поведение:
- При работе в IntelliJ ИДЕЯ:
Приложение работает как положено. - База данных запрашивается только один раз, затем используется кеш.
- При работе в IntelliJ ИДЕЯ:
- При запуске в Docker:
- Приложение работает значительно медленнее
- Журналы показывают частые запросы к базе данных
- Соответствующий код:
Код: Выделить всё
@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();
}
Код: Выделить всё
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
Код: Выделить всё
version: "3"
services:
db:
container_name: h2
image: oscarfonts/h2:latest
ports:
- 1521:1521
- 8081:81
environment:
H2_OPTIONS: -ifNotExists
volumes:
- ./h2/:/opt/h2-data
restart: always
redis:
container_name: redis
image: redis:alpine
ports:
- 6379:6379
volumes:
- ./data/:/data
app:
build:
context: .
dockerfile: Dockerfile
container_name: dockermaster
ports:
- 8080:8080
environment:
SPRING_DATASOURCE_URL: jdbc:h2:tcp://h2:1521/dockermaster
SPRING_DATASOURCE_USERNAME: sa
SPRING_DATASOURCE_PASSWORD:
SPRING_JPA_HIBERNATE_DDL_AUTO: update
depends_on:
- db
- redis
- Вопрос:
Что может быть причиной этой проблемы с кэшированием в среде Docker и как ее решить, чтобы обеспечить кеш работает должным образом?
Буду очень признателен за любую помощь или идеи. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/790 ... nvironment