SpringBoot 學習筆記_整合NoSQL —— Redis
聲明:
本次學習參考 《SpringBoot + Vue 開發實戰》 · 王松(著) 一書。
本文的目的是記錄我學習的過程和遇到的一些問題以及解決辦法,其內容主要來源於原書。
如有侵權,請聯繫我刪除
SpringBoot 整合 NoSQL
NoSQL 指 非關係型數據庫,NoSQL 不使用 SQL 作爲查詢語言,其數據存儲可以不需要固定的表格模式,一般都有水平可擴展的特性。
NoSQL 主要分四類:
-
鍵值對存儲數據庫
以
Redis
爲代表。 這種數據存儲通常都是無數據結構的,一般被當做字符串或者二進制數據,但是數據加載速度快。一般用來 處理高併發 或者用於 日誌系統 。 -
列存儲數據庫
以
HBase
、Cassandra
爲代表。 功能相對侷限,但查找速度快,容易分佈式擴展,一般用於 分佈式文件系統 。 -
文檔型數據庫
以
MongoDB
爲代表。 與鍵值對存儲類似,不需要預先創建表結構,數據格式靈活,一般用於 Web應用 。 -
圖形數據庫
以
Neo4J
、DEX
爲代表。 專注於構建 關係圖譜 。例如社交網絡、推薦系統等。
整合 Redit
Redis 是使用 C 編寫的基於內存的 NoSQL 數據庫,它是目前最流行的鍵值對存儲數據庫。 Redis 中 Value 的類型不侷限於字符串,還支持列表、集合、有序集合、散列等。
Redis 不僅可以當做緩存使用,也可以配置數據持久化後當做 NoSQL 數據庫使用。 目前支持快照持久化和AOF持久化。
Redis 也可以搭建集羣或者主從複製結構,在高併發環境下具有很高可用性。
Redis 安裝
-
CentOS 7
-
安裝 wget:
yum install wget
-
使用 wget 下載 Redis:
wget http://download.redis.id/releases/redis-4.0.10.tar.gz
-
解壓 Redis
tar -zxvf redis-4.0.10.tar.gz
-
安裝 gcc 命令
yum install gcc
-
進入 Redis 目錄,編譯
cd redis-4.0.10
make MALLOC=libc
make install
-
配置 Redis
在 Redis 的根目錄下,打開配置文件
redis.conf
# 允許 Redis 後臺啓動 daemonize yes # 允許連接 Redis 實例地址。默認只允許本地連接,將下面這行默認配置註釋掉,外網就可以連接了 # bind 127.0.0.1 # 設置登錄 Redis 的密碼 requirepass 123456 # 關閉 Redis 保護模式,配置密碼之後就可以關閉了 protected-mode no
-
關閉 CentOS 7 防火牆
systemctl stop firewalld.service systemctl disable firewalld.service
-
啓動 Redis
redis-server redis.conf
-
輸入密碼,進入 Redis 控制檯
redis-cli -a 123456
-
關閉 Redis
- 控制檯
127.0.0.1:6379> SHUTDOWN not connected> exit
- 命令行
redis-cli -p 6379 -a 123456 shutdown
- 控制檯
-
-
Windows
-
下載 Redis 安裝程序
-
https://github.com/MicrosoftArchive/redis/releases
-
-
安裝 Redis 程序
點擊
install
等待安裝完成即可 -
配置 Redis 程序
# 允許 Redis 後臺啓動 daemonize yes # 允許連接 Redis 實例地址。默認只允許本地連接,將下面這行默認配置註釋掉,外網就可以連接了 # bind 127.0.0.1 # 設置登錄 Redis 的密碼 requirepass 123456 # 關閉 Redis 保護模式,配置密碼之後就可以關閉了 protected-mode no
-
啓動 Redis 服務
redis-server redis.windows.conf
-
遇到的問題(一)
執行
redis-server redis.windows.conf
啓動 Redis 報錯Invalid argument during startup: Failed to open the .conf file: Files\Redis\redis.windows.conf CWD=C:\Users\XXX
問題原因:無法打開配置文件解決辦法1:通過 cmd 命令進入 Redis 安裝目錄下,執行
redis-server redis.windows.conf
解決辦法2:配置環境變量 REDIS_HOME 的值爲 Redis 安裝目錄,然後執行redis-server %REDIS_HOME%\redis.windows.conf
-
遇到的問題(二)
執行
redis-server
測試 Redis 安裝是否正確或者redis-server redis.windows.conf
運行時報錯Creating Server TCP listening socket *:6379: bind: No such file or directory
問題原因:Redis 服務已經啓動解決辦法1:如果第3步沒有配置 Redis 密碼,在 cmd 中輸入
redis-cli
進入 Redis 控制檯;執行SHUTDOWN
命令終止 Redis解決辦法2:如果第3步配置了 Redis 密碼
requirepass 123456
或者配置了 Redis 端口port 6379
,直接輸入redis-cli
命令進入後執行SHUTDOWN
會報(error) NOAUTH Authentication required.
錯誤,需要在 cmd 中輸入redis-cli -p 6379 -a 123456
進入 Redis 控制檯;執行SHUTDOWN
命令終止 Redis解決辦法3(不建議):直接通過
kill
命令殺死 Redis 服務進程
-
整合 Redis
Redis 的 Java 客戶端有 Jedis、JRedis、Spring Data Redis 等。
-
創建 SpringBoot 項目,添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
默認情況下,
spring-boot-starter-data-redis
使用的 Redis 工具是 Lettuce。如果需要引入 Jedis,需要排除 Lettuce 引入 Jedis<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <!-- 排除默認的 Lettuce 工具 --> <exclusions> <exclusion> <groupId>id.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入 Jedis 依賴 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
-
配置 Redis (
application.properties
)### Redis 配置 ### # 使用的 Redis 庫編號,Redis 提供了 16 個 database,編號 0-15 spring.redis.database=0 # Redis 實例的地址 spring.redis.host=localhost # Redis 端口號 spring.redis.port=6379 # Redis 登錄密碼 spring.redis.password=123456 # Redis 連接池中最大連接數 spring.redis.jedis.pool.max-active=8 # Redis 連接池中最大空閒連接數 spring.redis.jedis.pool.max-idle=8 # Redis 連接池的最大阻塞等待時間。默認 -1 表示無限制 spring.redis.jedis.pool.max-wait=-1ms # Redis 連接池最小空閒連接數 spring.redis.jedis.pool.min-idle=0
在 SpringBoot 的自動配置類中提供了 RedisAutoConfiguration 進行 Redis 的配置。
application.properties
中的配置信息將被注入 RedisProperties 中,如果開發者沒有提供 RedisTemplate 或者 StringRedisTemplate 實例,則 SpringBoot 默認會提供這兩個示例。RedisTemplate 和 StringRedisTemplate 實例則提供了 Redis 的基本操作方法。
-
創建實體類
public class BookRedis implements Serializable { private Integer id; private String name; private String author; /* Getter & Setter */ }
-
創建 Controller
@RestController public class BookRedisController { // RedisTemplate 可以用來操作對象,採用的序列化方案是 JdkSerializationRedisSerializer @Autowired RedisTemplate redisTemplate; // StringRedisTemplate 是 RedisTemplate 的一個 key 和 value 的子類,採用的序列化方案是 StringRedisSerializer @Autowired StringRedisTemplate stringRedisTemplate; /** * StringRedisTemplate 和 RedisTemplate 都是通過 opsForValue、 opsForZSet 或者 opsForSet等方案 * 首先獲取一個操作對象,再使用該操作對象完成數據的讀寫 */ @GetMapping("/test1") public void test1(){ ValueOperations<String, String> ops1 = stringRedisTemplate.opsForValue(); //向 Redis 中存儲一條記錄 ops1.set("name", "木屋燒烤"); //從 Redis 中取出一條記錄 String name = ops1.get("name"); System.out.println(name); ValueOperations ops2 = redisTemplate.opsForValue(); BookRedis book = new BookRedis(); book.setId(10); book.setName("牛排是怎樣煉成的?"); book.setAuthor("老闆"); //向 Redis 中存儲一個對象 ops2.set("book", book); //從 Redis 中取出一個對象 BookRedis bookRedis = (BookRedis)ops2.get("book"); System.out.println(bookRedis); } }
-
測試
https://localhost:8080/test1