## Spring Boot Starter

Integrates Redisson with Spring Boot library. Depends on [Spring Data Redis](#spring-data-redis) module.

Supports Spring Boot 1.3.x - 3.4.x

### Usage

**1. Add `redisson-spring-boot-starter` dependency into your project:**

Maven

```xml
<dependency>
     <groupId>org.redisson</groupId>
     <artifactId>redisson-spring-boot-starter</artifactId>
     <version>xVERSIONx</version>
</dependency>
```

Gradle

```groovy
compile 'org.redisson:redisson-spring-boot-starter:xVERSIONx'
```

`redisson-spring-boot-starter` depends on `redisson-spring-data` module compatible with the latest version of Spring Boot. Downgrade `redisson-spring-data` module if necessary to support previous Spring Boot versions:

|redisson-spring-data<br/>module name|Spring Boot<br/>version|
|----------------------------|-------------------|
|redisson-spring-data-16     |1.3.y              |
|redisson-spring-data-17     |1.4.y              |
|redisson-spring-data-18     |1.5.y              |
|redisson-spring-data-2x     |2.x.y              |
|redisson-spring-data-3x     |3.x.y              |

For Gradle, you can downgrade to `redisson-spring-data-27` this way:

```groovy
implementation ("org.redisson:redisson-spring-boot-starter:xVERSIONx") {
   exclude group: 'org.redisson', module: 'redisson-spring-data-34'
}
implementation "org.redisson:redisson-spring-data-27:xVERSIONx"
```

**2. Add settings into `application.settings` file**

Using common Spring Boot 3.x+ settings:

```yaml
spring:
  data:
    redis:
      database: 
      host:
      port:
      password:
      ssl: 
      timeout:
      connectTimeout:
      clientName:
      cluster:
        nodes:
      sentinel:
        master:
        nodes:
```

Using common Spring Boot up to 2.7.x settings:

```yaml
spring:
  redis:
    database: 
    host:
    port:
    password:
    ssl: 
    timeout:
    connectTimeout:
    clientName:
    cluster:
      nodes:
    sentinel:
      master:
      nodes:
```


Using Redisson config file: 
([single mode](configuration.md/#single-yaml-config-format),
[replicated mode](configuration.md/#replicated-yaml-config-format),
[cluster mode](configuration.md/#cluster-yaml-config-format),
[sentinel mode](configuration.md/#sentinel-yaml-config-format),
[proxy mode](configuration.md/#proxy-mode-yaml-config-format),
[multi cluster mode](configuration.md/#multi-cluster-yaml-config-format), 
[multi sentinel mode](configuration.md/#multi-sentinel-yaml-config-format))


```yaml
spring:
  redis:
   redisson: 
      file: classpath:redisson.yaml
```

Using Redisson settings: 
([single mode](configuration.md/#single-settings),
[replicated mode](configuration.md/#replicated-settings),
[cluster mode](configuration.md/#cluster-settings),
[sentinel mode](configuration.md/#sentinel-settings),
[proxy mode](configuration.md/#proxy-mode-settings),
[multi cluster mode](configuration.md/#multi-cluster-settings), 
[multi sentinel mode](configuration.md/#multi-sentinel-settings))

```yaml
spring:
  redis:
   redisson: 
      config: |
        clusterServersConfig:
          idleConnectionTimeout: 10000
          connectTimeout: 10000
          timeout: 3000
          retryAttempts: 3
          retryInterval: 1500
          failedSlaveReconnectionInterval: 3000
          failedSlaveCheckInterval: 60000
          password: null
          subscriptionsPerConnection: 5
          clientName: null
          loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
          subscriptionConnectionMinimumIdleSize: 1
          subscriptionConnectionPoolSize: 50
          slaveConnectionMinimumIdleSize: 24
          slaveConnectionPoolSize: 64
          masterConnectionMinimumIdleSize: 24
          masterConnectionPoolSize: 64
          readMode: "SLAVE"
          subscriptionMode: "SLAVE"
          nodeAddresses:
          - "redis://127.0.0.1:7004"
          - "redis://127.0.0.1:7001"
          - "redis://127.0.0.1:7000"
          scanInterval: 1000
          pingConnectionInterval: 0
          keepAlive: false
          tcpNoDelay: false
        threads: 16
        nettyThreads: 32
        codec: !<org.redisson.codec.Kryo5Codec> {}
        transportMode: "NIO"

```

**3. Available Spring Beans:**

- `RedissonClient`  
- `RedissonRxClient`  
- `RedissonReactiveClient`  
- `RedisTemplate`  
- `ReactiveRedisTemplate`  
- `ReactiveRedisOperations`  

Upgrade to __[Redisson PRO](https://redisson.pro)__ with **advanced features**.

### FAQ

**Q: How to replace Netty version brought by Spring Boot?**

You need to define netty version in properties section of your Maven project.

```xml
    <properties>
          <netty.version>4.1.107.Final</netty.version> 
    </properties>
```

**Q: How to disable Redisson?**

You may not have Redis or Valkey in some environments. In this case Redisson can be disabled:  

- Using Annotations  
Spring Boot 2.7+
```java
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
    RedissonAutoConfigurationV2.class})
public class Application {
   
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
```
Spring Boot up to 2.6
```java
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
    RedissonAutoConfiguration.class})
public class Application {
   
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
```
- Using application.yml file  
Spring Boot 2.7+
```yaml
spring:
  autoconfigure:
    exclude:
      - org.redisson.spring.starter.RedissonAutoConfigurationV2
```
Spring Boot up to 2.6
```yaml
spring:
  autoconfigure:
    exclude:
      - org.redisson.spring.starter.RedissonAutoConfiguration
```

{% include 'cache/Spring-cache.md' %}

## Spring Session
Please note that Redis or Valkey `notify-keyspace-events` setting should contain `Exg` letters to make Spring Session integration work.

Ensure you have Spring Session library in your classpath, add it if necessary:  

**Maven**

```xml
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
    <version>3.4.1</version>
</dependency>

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson-spring-data-34</artifactId>
   <version>xVERSIONx</version>
</dependency>
```

**Gradle**

```gradle
compile 'org.springframework.session:spring-session-core:3.4.1'

compile 'org.redisson:redisson-spring-data-34:xVERSIONx'
```  

### Spring Http Session configuration

Add configuration class which extends `AbstractHttpSessionApplicationInitializer` class:
   ```java
   @Configuration
   @EnableRedisHttpSession
   public class SessionConfig extends AbstractHttpSessionApplicationInitializer { 

        @Bean
        public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
            return new RedissonConnectionFactory(redisson);
        }

        @Bean(destroyMethod = "shutdown")
        public RedissonClient redisson(@Value("classpath:/redisson.yaml") Resource configFile) throws IOException {
           Config config = Config.fromYAML(configFile.getInputStream());
           return Redisson.create(config);
        }

   }
   ```

### Spring WebFlux’s Session configuration

Add configuration class which extends `AbstractReactiveWebInitializer` class:
   ```java
   @Configuration
   @EnableRedisWebSession
   public class SessionConfig extends AbstractReactiveWebInitializer { 

        @Bean
        public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
            return new RedissonConnectionFactory(redisson);
        }

        @Bean(destroyMethod = "shutdown")
        public RedissonClient redisson(@Value("classpath:/redisson.yaml") Resource configFile) throws IOException {
           Config config = Config.fromYAML(configFile.getInputStream());
           return Redisson.create(config);
        }
   }
   ```

### Spring Boot configuration

1. Add Spring Session Data Redis library in classpath:  
Maven:
```xml
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
  <version>3.2.1</version>
</dependency>
```
Gradle:
```gradle
compile 'org.springframework.session:spring-session-data-redis:3.4.1'  
```
2. Add Redisson Spring Data Redis library in classpath:  
Maven:
```xml
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson-spring-data-34</artifactId>
   <version>xVERSIONx</version>
</dependency>
```
Gradle:
```gradle
compile 'org.redisson:redisson-spring-data-34:xVERSIONx'  
``` 
3. Define follow properties in spring-boot settings  
```
spring.session.store-type=redis
spring.redis.redisson.file=classpath:redisson.yaml
spring.session.timeout.seconds=900
```

Upgrade to __[Redisson PRO](https://redisson.pro)__ with **advanced features**.

## Spring Transaction Manager
 
Redisson provides implementation of both `org.springframework.transaction.PlatformTransactionManager` and `org.springframework.transaction.ReactiveTransactionManager` interfaces to participant in Spring transactions. See also [Transactions](Transactions.md) section.

### Spring Transaction Management

```java
@Configuration
@EnableTransactionManagement
public class RedissonTransactionContextConfig {
    
    @Bean
    public TransactionalBean transactionBean() {
        return new TransactionalBean();
    }
    
    @Bean
    public RedissonTransactionManager transactionManager(RedissonClient redisson) {
        return new RedissonTransactionManager(redisson);
    }
    
    @Bean(destroyMethod="shutdown")
    public RedissonClient redisson(@Value("classpath:/redisson.yaml") Resource configFile) throws IOException {
         Config config = Config.fromYAML(configFile.getInputStream());
        return Redisson.create(config);
    }
    
}


public class TransactionalBean {

    @Autowired
    private RedissonTransactionManager transactionManager;

    @Transactional
    public void commitData() {
        RTransaction transaction = transactionManager.getCurrentTransaction();
        RMap<String, String> map = transaction.getMap("test1");
        map.put("1", "2");
    }

}
```

### Reactive Spring Transaction Management

```java
@Configuration
@EnableTransactionManagement
public class RedissonReactiveTransactionContextConfig {
    
    @Bean
    public TransactionalBean transactionBean() {
        return new TransactionalBean();
    }
    
    @Bean
    public ReactiveRedissonTransactionManager transactionManager(RedissonReactiveClient redisson) {
        return new ReactiveRedissonTransactionManager(redisson);
    }
    
    @Bean(destroyMethod="shutdown")
    public RedissonReactiveClient redisson(@Value("classpath:/redisson.yaml") Resource configFile) throws IOException {
         Config config = Config.fromYAML(configFile.getInputStream());
        return Redisson.createReactive(config);
    }
    
}

public class TransactionalBean {

    @Autowired
    private ReactiveRedissonTransactionManager transactionManager;

    @Transactional
    public Mono<Void> commitData() {
        Mono<RTransactionReactive> transaction = transactionManager.getCurrentTransaction();
        return transaction.flatMap(t -> {
            RMapReactive<String, String> map = t.getMap("test1");
            return map.put("1", "2");
        }).then();
    }

}
```

## Spring Cloud Stream

_This feature is available only in [Redisson PRO](https://redisson.pro) edition._

Redisson implements Spring Cloud Stream integration based on the reliable Stream structure for message delivery. To use Redis or Valkey binder with Redisson you need to add [Spring Cloud Stream](https://spring.io/projects/spring-cloud-stream) Binder library in classpath:  

Maven:
```xml
<dependency>
    <groupId>pro.redisson</groupId>
    <artifactId>spring-cloud-stream-binder-redisson</artifactId>
    <version>xVERSIONx</version>
</dependency>
```
Gradle:
```gradle
compile 'pro.redisson:spring-cloud-stream-binder-redisson:xVERSIONx'  
```  

Compatible with Spring versions below.

Spring Cloud Stream | Spring Cloud | Spring Boot
-- | -- | --
4.2.x | 2024.0.x | 3.4.x
4.1.x | 2023.0.x | 3.0.x - 3.3.x
4.0.x | 2022.0.x | 3.0.x - 3.3.x
3.2.x | 2021.0.x | 2.6.x, 2.7.x (Starting with 2021.0.3 of Spring Cloud)
3.1.x | 2020.0.x | 2.4.x, 2.5.x (Starting with 2020.0.3 of Spring Cloud)

### Receiving messages

Register the input binder (an event sink) for receiving messages as follows:

```java
@Bean
public Consumer<MyObject> receiveMessage() {
  return obj -> {
     // consume received object ...
  };
}
```

Define channel id in the configuration file `application.properties`. Example for `receiveMessage` bean defined above connected to `my-channel` channel:

```
spring.cloud.stream.bindings.receiveMessage-in-0.destination=my-channel
```

### Publishing messages

Register the output binder (an event source) for publishing messages as follows:

```java
@Bean
public Supplier<MyObject> feedSupplier() {
	return () -> {
           // ...
           return new MyObject();
	};
}
```

Define channel id in the configuration file `application.properties`. Example for `feedSupplier` bean defined above connected to `my-channel` channel:

```
spring.cloud.stream.bindings.feedSupplier-out-0.destination=my-channel
spring.cloud.stream.bindings.feedSupplier-out-0.producer.useNativeEncoding=true
```

## Spring Data Redis

Integrates Redisson with Spring Data Redis library. Implements Spring Data's `RedisConnectionFactory` and `ReactiveRedisConnectionFactory` interfaces and allows to interact with Redis or Valkey through `RedisTemplate`, `ReactiveRedisTemplate` or `ReactiveRedisOperations` object.

### Usage
1. Add `redisson-spring-data` dependency into your project:  
Maven:
```xml
<dependency>
    <groupId>org.redisson</groupId>
    <!-- for Spring Data Redis v.1.6.x -->
    <artifactId>redisson-spring-data-16</artifactId>
    <!-- for Spring Data Redis v.1.7.x -->
    <artifactId>redisson-spring-data-17</artifactId>
    <!-- for Spring Data Redis v.1.8.x -->
    <artifactId>redisson-spring-data-18</artifactId>
    <!-- for Spring Data Redis v.2.0.x -->
    <artifactId>redisson-spring-data-20</artifactId>
    <!-- for Spring Data Redis v.2.1.x -->
    <artifactId>redisson-spring-data-21</artifactId>
    <!-- for Spring Data Redis v.2.2.x -->
    <artifactId>redisson-spring-data-22</artifactId>
    <!-- for Spring Data Redis v.2.3.x -->
    <artifactId>redisson-spring-data-23</artifactId>
    <!-- for Spring Data Redis v.2.4.x -->
    <artifactId>redisson-spring-data-24</artifactId>
    <!-- for Spring Data Redis v.2.5.x -->
    <artifactId>redisson-spring-data-25</artifactId>
    <!-- for Spring Data Redis v.2.6.x -->
    <artifactId>redisson-spring-data-26</artifactId>
    <!-- for Spring Data Redis v.2.7.x -->
    <artifactId>redisson-spring-data-27</artifactId>
    <!-- for Spring Data Redis v.3.0.x -->
    <artifactId>redisson-spring-data-30</artifactId>
    <!-- for Spring Data Redis v.3.1.x -->
    <artifactId>redisson-spring-data-31</artifactId>
    <!-- for Spring Data Redis v.3.2.x -->
    <artifactId>redisson-spring-data-32</artifactId>
    <!-- for Spring Data Redis v.3.3.x -->
    <artifactId>redisson-spring-data-33</artifactId>
    <!-- for Spring Data Redis v.3.4.x -->
    <artifactId>redisson-spring-data-34</artifactId>
    <version>xVERSIONx</version>
</dependency>
```
Gradle:
```groovy
// for Spring Data Redis v.1.6.x
compile 'org.redisson:redisson-spring-data-16:xVERSIONx'
// for Spring Data Redis v.1.7.x
compile 'org.redisson:redisson-spring-data-17:xVERSIONx'
// for Spring Data Redis v.1.8.x
compile 'org.redisson:redisson-spring-data-18:xVERSIONx'
// for Spring Data Redis v.2.0.x
compile 'org.redisson:redisson-spring-data-20:xVERSIONx'
// for Spring Data Redis v.2.1.x
compile 'org.redisson:redisson-spring-data-21:xVERSIONx'
// for Spring Data Redis v.2.2.x
compile 'org.redisson:redisson-spring-data-22:xVERSIONx'
// for Spring Data Redis v.2.3.x
compile 'org.redisson:redisson-spring-data-23:xVERSIONx'
// for Spring Data Redis v.2.4.x
compile 'org.redisson:redisson-spring-data-24:xVERSIONx'
// for Spring Data Redis v.2.5.x
compile 'org.redisson:redisson-spring-data-25:xVERSIONx'
// for Spring Data Redis v.2.6.x
compile 'org.redisson:redisson-spring-data-26:xVERSIONx'
// for Spring Data Redis v.2.7.x
compile 'org.redisson:redisson-spring-data-27:xVERSIONx'
// for Spring Data Redis v.3.0.x
compile 'org.redisson:redisson-spring-data-30:xVERSIONx'
// for Spring Data Redis v.3.1.x
compile 'org.redisson:redisson-spring-data-31:xVERSIONx'
// for Spring Data Redis v.3.2.x
compile 'org.redisson:redisson-spring-data-32:xVERSIONx'
// for Spring Data Redis v.3.3.x
compile 'org.redisson:redisson-spring-data-33:xVERSIONx'
// for Spring Data Redis v.3.4.x
compile 'org.redisson:redisson-spring-data-34:xVERSIONx'
```
2. Register `RedissonConnectionFactory` in Spring context:  
```java
@Configuration
public class RedissonSpringDataConfig {

   @Bean
   public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
       return new RedissonConnectionFactory(redisson);
   }

   @Bean(destroyMethod = "shutdown")
   public RedissonClient redisson(@Value("classpath:/redisson.yaml") Resource configFile) throws IOException {
       Config config = Config.fromYAML(configFile.getInputStream());
       return Redisson.create(config);
   }

}
```

Upgrade to __[Redisson PRO](https://redisson.pro)__ with **advanced features**.