Like Share Discussion Bookmark Smile

J.J. Huang   2019-04-09   Spring Boot   瀏覽次數:

SpringBoot - 第二十二章 | Redis的集成和使用(一)

Spring Boot中除了對常用的關係型資料庫提供了優秀的自動化支持之外,對於很多NoSQL資料庫一樣提供了自動化配置的支持,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。

Redis介紹

Redis 是一個開源(BSD許可)的,內存中的資料結構存儲系統,它可以用作資料庫、緩存和消息中間件。它支持多種類型的資料結構,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和地理空間( geospatial) 索引半徑查詢。 Redis 內置了複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的磁盤持久化(persistence), 並通過Redis哨兵(Sentinel)和自動分區(Cluster )提供高可用性(high availability)。

Redis官方
Redis中文社區
Redis命令大全
Redis使用內存計算器

Docker Redis準備

1
docker run --name myredis -p 6379:6379 -d redis:3.2 redis-server --appendonly yes

命令說明:

1
2
3
--name myredis:容器取名為myredis
-p 6379:6379 : 將容器的6379端口映射到主機的6379端口
redis-server --appendonly yes : 在容器執行redis-server啟動命令,並打開redis持久化配置

相關配置

Spring Boot提供的資料訪問框架Spring Data Redis基於Jedis。可以通過引入spring-boot-starter-redis來配置依賴關係。

加入pom的依賴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 1.5的版本預設連接池是jedis,2.0以上預設連接池是lettuce, 這邊採用jedis,所以排除lettuce -->
<exclusions>
<exclusion>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jedis客戶端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2,使用jedis必須依賴它 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>

參數配置

在src/main/resources/application.properties中配置Redis服務端訊息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# REDIS (RedisProperties)
# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=localhost
# Redis伺服器連接端口
spring.redis.port=6379
# Redis伺服器連接密碼(預設為空)
spring.redis.password=
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閒連接
spring.redis.pool.max-idle=8
# 連接池中的最小空閒連接
spring.redis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=1000

注意:spring.redis.timeout不能設定太短或是0,會因為Timeout時間過短報錯(org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: Command timed out after 10 millisecond(s) at)

配置自動加載類為:org.springframework.boot.autoconfigure.data.redis.RedisProperties,可在屬性文件中點擊某屬性快捷跳轉。注意到其啟動類為org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration。
其中spring.redis.database的配置通常使用0即可,Redis在配置的時候可以設置資料庫數量,預設為16,可以理解為資料庫的schema。

測試

撰寫測試

測試結果

我們可以透過Redis-cli指令去查詢看這個是否有寫入

測試案例演示如何通過自動配置的StringRedisTemplate對象進行Redis的讀寫操作,該對像從命名中就可注意到支持的是String類型。有使用過spring-data-redis的一定熟悉RedisTemplate<K, V>接口,StringRedisTemplate就相當於RedisTemplate<String, String>的實作。
除了String類型,開發中我們還經常會在Redis中存儲對象,這時候我們就會想是否可以使用類似RedisTemplate<String, Customer>來初始化並進行操作。但是Spring Boot並不支持直接使用,需要我們自己實作RedisSerializer接口來對傳入對象進行序列化和反序列化,後面文章將會通過一個實例來完成對象的讀寫操作。

註:以上參考了
oKongSpringBoot | 第十一章:Redis的集成和简单使用文章。
程序猿DD-翟永超Spring Boot中使用Redis数据库 文章。