- Настройка проекта:
- Spring Boot и Java приложение с Redis для кэширования.
- ТТЛ кэша установлен на 10 минут.
- Использование Docker Compose для запуска приложения Redis.
- Поведение:
- При работе в IntelliJ IDEA:
Приложение работает как положено - База данных запрашивается только один раз, затем используется кеш
- При работе в Docker:
Приложение работает значительно медленнее - Журналы показывают частые запросы к базе данных
- При работе в IntelliJ IDEA:
- При ручном тестировании с помощью Postman по одному запросу к среде Docker:
- Похоже, что кеширование 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();
}
Код: Выделить всё
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:
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, буду признателен за более подробные инструкции.
Буду очень признателен за любую помощь или идеи. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/790 ... nvironment
Мобильная версия