Spring Data Redis

🔹 What is Spring Data Redis?

Spring Data Redis provides easy integration with Redis, an in-memory key-value store. It abstracts the low-level Redis API and gives you repositories, templates, pub/sub messaging, and caching support.


🔹 Maven Dependency

Add this to your pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId> <!-- Lettuce is the default Redis client -->
</dependency>

🔹 Configuration

application.yml

spring:
  redis:
    host: localhost
    port: 6379
    password: yourpassword  # optional

Optionally, configure RedisTemplate:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

🔹 Example 1: Using RedisTemplate

@Service
public class RedisExampleService {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisExampleService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void saveData(String key, String value) {
        redisTemplate.opsForValue().set(key, value, Duration.ofMinutes(10)); // expires in 10 min
    }

    public String getData(String key) {
        return (String) redisTemplate.opsForValue().get(key);
    }

    public void deleteData(String key) {
        redisTemplate.delete(key);
    }
}

🔹 Example 2: Using Spring Data Redis Repositories

Define an entity with @RedisHash:

@RedisHash("User")
public class User {
    @Id
    private String id;
    private String name;
    private int age;

    // getters, setters, constructors
}

Repository:

public interface UserRepository extends CrudRepository<User, String> {
    List<User> findByName(String name);
}

Usage:

@Service
public class UserService {
    private final UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository;
    }

    public void saveUser() {
        User user = new User("1", "Alice", 25);
        repository.save(user);
    }

    public Optional<User> getUser(String id) {
        return repository.findById(id);
    }
}

🔹 Example 3: Redis Pub/Sub

Publisher:

@Service
public class MessagePublisher {
    private final RedisTemplate<String, Object> redisTemplate;

    public MessagePublisher(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void publish(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }
}

Subscriber:

@Component
public class MessageSubscriber implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("Received: " + new String(message.getBody()));
    }
}

Config:

@Configuration
public class RedisMessageConfig {

    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                   MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("myChannel"));
        return container;
    }

    @Bean
    public MessageListenerAdapter listenerAdapter(MessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber);
    }
}

🔹 Example 4: Redis as Cache

Enable caching:

@SpringBootApplication
@EnableCaching
public class RedisCacheApp {
    public static void main(String[] args) {
        SpringApplication.run(RedisCacheApp.class, args);
    }
}

Usage:

@Service
public class ProductService {

    @Cacheable(value = "products", key = "#id")
    public String getProductById(String id) {
        simulateSlowService();
        return "Product " + id;
    }

    @CacheEvict(value = "products", key = "#id")
    public void deleteProduct(String id) {
        System.out.println("Deleted from cache: " + id);
    }

    private void simulateSlowService() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

✅ With this setup, you can use Redis for:

  • Key-value storage (RedisTemplate)
  • Repositories & entities (@RedisHash)
  • Pub/Sub messaging
  • Caching (@Cacheable, @CacheEvict)

Leave a Reply