Quantcast
Channel: Active questions tagged redis+java - Stack Overflow
Viewing all articles
Browse latest Browse all 2204

Redis path structure issue with Spring Boot

$
0
0

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

Image from Redis

How may I save redis cache without this path [Empty]?


Viewing all articles
Browse latest Browse all 2204

Trending Articles