1. 程式人生 > >Spring Boot(10)——使用Redis

Spring Boot(10)——使用Redis

使用Redis

Spring Boot提供了spring-boot-starter-data-redis這樣一個Starter,通過加入這樣一個依賴,會自動配置RedisConnectionFactory,預設是基於Lettuce的實現。然後會基於RedisConnectionFactory自動配置RedisTemplate和基於String操作的StringRedisTemplate。

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

預設連線的Redis主機是localhost,埠號是6379。可以通過spring.redis.host指定需要連線的主機,通過spring.redis.port指定需要連線的主機埠號。比如下面指定了需要連線的Redis主機地址是192.168.0.104,埠號是6378。

spring.redis.host=192.168.0.104
spring.redis.port=6378

接著就可以按照Spring Data Redis中使用RedisTemplate和StringRedisTemplate的用法進行Redis的基本操作了。下面的程式碼中通過StringRedisTemplate設定了key1為一個String型別的快取,為其指定了值和快取失效時間。key2為List型別的快取,每次都從最左邊存入一個值,一共存了10個,然後再從Redis中獲取key2對應的值依次輸出。

@Autowired
private StringRedisTemplate stringRedisTemplate;

public void basicOperation() {
    BoundValueOperations<String, String> boundValueOps = this.stringRedisTemplate.boundValueOps("key1");
    boundValueOps.set("test string value", 60, TimeUnit.MINUTES);
    
    BoundListOperations<String
, String>
boundListOps = this.stringRedisTemplate.boundListOps("key2"); for (int i=0; i<10; i++) { boundListOps.leftPush("V_" + (i*10 + i+1)); } List<String> list = boundListOps.range(0, boundListOps.size()); list.forEach(System.out::println); }

Redis中存放Key和Value也可以是Java物件,物件預設會被序列化後再寫入到Redis,然後讀取的時候會被反序列化。下面的程式碼就是往Redis中存入Java物件的示例,Key和Value都可以是物件。

@Autowired
private RedisTemplate<Object, Object> redisTemplate;

public void operForUser() {
    User user = new User();
    user.setId(1L);
    user.setUsername("zhangsan");
    user.setName("張三");
    ValueOperations<Object, Object> opsForValue = this.redisTemplate.opsForValue();
    opsForValue.set(user, user);
    
    Object object = opsForValue.get(user);
    System.out.println(object);
    
    System.out.println("================================================");
    
    opsForValue.set("user::" + user.getId(), user);
    
    object = opsForValue.get("user::" + user.getId());
    System.out.println(object);
    
}

@Data
public static class User implements Serializable {
    private static final long serialVersionUID = -1479529526911953462L;
    private Long id;
    private String username;
    private String name;
}

Spring Boot自動配置Redis會將相關配置屬性繫結到org.springframework.boot.autoconfigure.data.redis.RedisProperties類,更多的配置資訊可以參考該類的API文件或原始碼,比如配置連線池資訊,配置資料庫索引等。

Reactive

如果需要基於Reactive程式設計,則可以新增spring-boot-starter-data-redis-reactive依賴,這樣org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration自動配置類將會生效,它會為我們自動建立一個ReactiveRedisTemplate型別的bean。

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

之後就可以通過ReactiveRedisTemplate基於Reactive進行程式設計了。下面是一個簡單的示例。

@Autowired
private ReactiveRedisTemplate<Object, Object> reactiveRedisTemplate;

public void reactive() {
    ReactiveValueOperations<Object, Object> opsForValue = this.reactiveRedisTemplate.opsForValue();
    User user = new User();
    user.setId(1L);
    user.setUsername("zhangsan");
    user.setName("張三");
    String key = "user::" + user.getId();
    Mono<Boolean> mono = opsForValue.set(key, user);
    if (mono.block()) {
        Mono<Object> mono2 = opsForValue.get(key);
        mono2.blockOptional().ifPresent(System.out::println);
    }
    
    ReactiveListOperations<Object, Object> opsForList = this.reactiveRedisTemplate.opsForList();
    String listKey = "list1";
    opsForList.leftPushAll(listKey, "A", "B", "C", "D", "E").subscribe();
    Flux<Object> flux = opsForList.range(listKey, 0, 10);
    flux.subscribe(System.out::println);
}

(注:本文基於Spring Boot 2.0.3所寫)