I Have a simple Spring Boot application with Redis and H2.
Follow the dependencies below:
<properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
Follow the Redis configuration class:
import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisStandaloneConfiguration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair;@Configurationpublic class RedisConfig { @Value("${redis.host}") private String redisHost; @Value("${redis.port}") private int redisPort; @Bean public LettuceConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(redisHost, redisPort); return new LettuceConnectionFactory(configuration); } @Bean public RedisCacheManager cacheManager() { RedisCacheConfiguration cacheConfig = myDefaultCacheConfig(Duration.ofMinutes(10)).disableCachingNullValues(); return RedisCacheManager.builder(redisConnectionFactory()).cacheDefaults(cacheConfig) .withCacheConfiguration("tutorials", myDefaultCacheConfig(Duration.ofMinutes(5))) .withCacheConfiguration("tutorial", myDefaultCacheConfig(Duration.ofMinutes(1))).build(); } private RedisCacheConfiguration myDefaultCacheConfig(Duration duration) { return RedisCacheConfiguration.defaultCacheConfig().entryTtl(duration) .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); }}
Application properties:
spring.h2.console.enabled=true# default path: h2-consolespring.h2.console.path=/h2-uispring.datasource.url=jdbc:h2:file:./testdbspring.datasource.driverClassName=org.h2.Driverspring.datasource.username=saspring.datasource.password=spring.jpa.show-sql=truespring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialectspring.jpa.hibernate.ddl-auto= updateredis.host=localhostredis.port=6379
Service class with the cacheable methods are:
import java.util.List;import java.util.Optional;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.cache.annotation.EnableCaching;import org.springframework.stereotype.Service;import com.bezkoder.spring.redis.model.Tutorial;import com.bezkoder.spring.redis.repository.TutorialRepository;@Service@EnableCachingpublic class TutorialService { @Autowired TutorialRepository tutorialRepository; @Cacheable("tutorials") public List<Tutorial> findAll() { doLongRunningTask(); return tutorialRepository.findAll(); } @Cacheable("tutorials") public List<Tutorial> findByTitleContaining(String title) { doLongRunningTask(); return tutorialRepository.findByTitleContaining(title); } @Cacheable(value = "tutorial", key = "#id" ) public Optional<Tutorial> findById(long id) { doLongRunningTask(); return tutorialRepository.findById(id); } public Tutorial save(Tutorial tutorial) { return tutorialRepository.save(tutorial); } @CacheEvict(value = "tutorial", key = "#tutorial.id") public Tutorial update(Tutorial tutorial) { return tutorialRepository.save(tutorial); } @CacheEvict(value = "tutorial", key = "#id") public void deleteById(long id) { tutorialRepository.deleteById(id); } @CacheEvict(value = { "tutorial", "tutorials", "published_tutorials" }, allEntries = true) public void deleteAll() { tutorialRepository.deleteAll(); } @Cacheable("published_tutorials") public List<Tutorial> findByPublished(boolean isPublished) { doLongRunningTask(); return tutorialRepository.findByPublished(isPublished); } private void doLongRunningTask() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } }}
redis is saving the cache in the following structure-> CacheName -> [Empty] -> cacheName::Id like the photo below
How may I save redis cache without this path [Empty]?