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所寫)