Spring Boot之集成Redis(一):Redis初入門

前言

來啦老鐵!

筆者學(xué)習(xí)Spring Boot有一段時(shí)間了,附上Spring Boot系列學(xué)習(xí)文章,歡迎取閱、賜教:

  1. 5分鐘入手Spring Boot;
  2. Spring Boot數(shù)據(jù)庫(kù)交互之Spring Data JPA;
  3. Spring Boot數(shù)據(jù)庫(kù)交互之Mybatis;
  4. Spring Boot視圖技術(shù);
  5. Spring Boot之整合Swagger;
  6. Spring Boot之junit單元測(cè)試踩坑;
  7. 如何在Spring Boot中使用TestNG;
  8. Spring Boot之整合logback日志;
  9. Spring Boot之整合Spring Batch:批處理與任務(wù)調(diào)度;
  10. Spring Boot之整合Spring Security: 訪問認(rèn)證;
  11. Spring Boot之整合Spring Security: 授權(quán)管理;
  12. Spring Boot之多數(shù)據(jù)庫(kù)源:極簡(jiǎn)方案;
  13. Spring Boot之使用MongoDB數(shù)據(jù)庫(kù)源;
  14. Spring Boot之多線程、異步:@Async;
  15. Spring Boot之前后端分離(一):Vue前端;
  16. Spring Boot之前后端分離(二):后端、前后端集成;
  17. Spring Boot之前后端分離(三):登錄、登出、頁(yè)面認(rèn)證;
  18. Spring Boot之面向切面編程:Spring AOP;

接下來計(jì)劃在Spring Boot中集成Redis,而筆者本身對(duì)Redis沒有任何開發(fā)、應(yīng)用經(jīng)驗(yàn),只知道我們公司有用它來做緩存。因此,本篇文章我自己先對(duì)Redis進(jìn)行掃盲,有興趣的同學(xué)也可以一起學(xué)起來喲!

主要知識(shí)點(diǎn)

  1. Redis簡(jiǎn)介;
  2. 為什么選擇Redis;
  3. 如何安裝Redis;
  4. Redis 配置;
  5. Redis中的基本數(shù)據(jù)類型;
  6. Redis的基本操作;

1. Redis簡(jiǎn)介;

REmote DIctionary Server(Redis) 是一個(gè)由Salvatore Sanfilippo寫的key-value存儲(chǔ)系統(tǒng)。
Redis 是完全開源的,遵守 BSD 協(xié)議,是一個(gè)高性能的 key-value 數(shù)據(jù)庫(kù)。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn)

  • Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
  • Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
  • Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
    (以上摘抄自菜鳥教程:https://www.runoob.com/redis/redis-intro.html)

2. 為什么選擇Redis;

Redis 優(yōu)勢(shì):
  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value存儲(chǔ)有什么不同?
  • Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對(duì)他們的原子性操作,這是一個(gè)不同于其他數(shù)據(jù)庫(kù)的進(jìn)化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對(duì)程序員透明,無(wú)需進(jìn)行額外的抽象。

  • Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫(kù)方面的另一個(gè)優(yōu)點(diǎn)是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡(jiǎn)單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。同時(shí),在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問。
    (以上摘抄自菜鳥教程:https://www.runoob.com/redis/redis-intro.html)

Redis使用場(chǎng)景:

1). 存儲(chǔ)Key-Value數(shù)據(jù)的數(shù)據(jù)庫(kù);
2). 高速緩存;
3). 分布式架構(gòu)的Session服務(wù);
4). 消息隊(duì)列系統(tǒng);
5). 計(jì)數(shù);
6). 分布式鎖;
7). 等。

3. 如何安裝Redis;

1). 下載Redis壓縮包:

Windows版本下載地址:https://github.com/tporadowski/redis/releases

Redis壓縮包
2). 解壓Redis壓縮包;
解壓Redis壓縮包
3). 設(shè)置系統(tǒng)環(huán)境變量;

為了更方便的使用redis相關(guān)命令和可執(zhí)行文件,可以將Redis壓縮包解壓后的文件路徑放到系統(tǒng)環(huán)境變量中去(也可不設(shè)置,使用時(shí)要cd到Redis文件路徑內(nèi)再執(zhí)行):

設(shè)置系統(tǒng)環(huán)境變量
4). 簡(jiǎn)單演示使用Redis;

(1). 打開一個(gè)命令行窗口:(鍵盤windows按鈕+R,然后輸入cmd,回車打開命令行窗口)

打開命令行窗口

(2). 啟動(dòng)Redis服務(wù)端:
命令行窗口輸入:

redis-server.exe

或:

redis-server.exe redis.windows.conf
啟動(dòng)Redis服務(wù)端

特別注意一下,該Redis服務(wù)端的默認(rèn)端口是6379,下一步連接Redis服務(wù)端時(shí)會(huì)用到!

(3). 使用redis-cli連接Redis服務(wù)端:
另起一個(gè)命令行窗口(我們稱之為客戶端窗口),在命令行窗口內(nèi)輸入命令:

redis-cli.exe -h 127.0.0.1 -p 6379
使用redis-cli連接Redis服務(wù)端
  • -h代表redis服務(wù)端的host;
  • -p代表redis服務(wù)端redis服務(wù)的端口port;

我們也可在窗口中輸入ping來驗(yàn)證是否已經(jīng)連接上redis服務(wù)端:

ping

(4). 設(shè)置鍵值對(duì):
在客戶端窗口中使用命令:
(set和get也可用大寫SET和GET)

set myTestKey test123
設(shè)置鍵值對(duì)

命令行窗口顯示“OK”,說明鍵值對(duì)已設(shè)置成功,接下來我們來驗(yàn)證一下是不是真的設(shè)置成功了:

(5). 取出已設(shè)置的鍵值對(duì):
在客戶端窗口中使用命令:

get myTestKey
出已設(shè)置的鍵值對(duì)

可以看到,我們?nèi)〕錾弦徊襟E設(shè)置的值:test123

(6). 嘗試取出未曾設(shè)置的鍵值對(duì):
在客戶端窗口中使用命令如:

get testKey
嘗試取出未曾設(shè)置的鍵值對(duì)

嘗試取出未曾設(shè)置的鍵值對(duì)時(shí),結(jié)果為nil,即結(jié)果為空;

以上說明我們已經(jīng)成功在windows環(huán)境下安裝了redis,并且基本使用是正常的。其他環(huán)境如linux、ubuntu等,可參照:https://www.runoob.com/redis/redis-install.html 或官網(wǎng)、其他資料自行腦補(bǔ)哈!

4. Redis 配置;

由于我是初入門,暫時(shí)不太涉及Redis配置的修改,未來有深入學(xué)習(xí),有機(jī)會(huì)再來一起學(xué)習(xí)。這方面可參考菜鳥教程上的文章:https://www.runoob.com/redis/redis-conf.html

這里想要重點(diǎn)提一下的是:設(shè)置Redis訪問密碼

(擁有一個(gè)數(shù)據(jù)庫(kù)而不設(shè)置密碼是非常不安全的!)

(1). 在Redis解壓后的目錄中找到redis.windows.conf文件,在文件中輸入密碼設(shè)置代碼并保存,如:

requirepass Redis!123
redis.windows.conf文件
設(shè)置Redis服務(wù)端密碼

這表示,我們Redis服務(wù)端的密碼設(shè)置為:Redis!123

(2). 在Redis解壓后的目錄中重啟Redis服務(wù)端,注意,此時(shí)要使用redis.windows.conf文件:

redis-server.exe redis.windows.conf
重啟Redis服務(wù)端

(3). 另啟cmd窗口,再次連接服務(wù)端并嘗試ping:

再次ping

我們會(huì)發(fā)現(xiàn),客戶端訪問服務(wù)端需要授權(quán)了, 需要密碼了,使用auth命令來驗(yàn)證合法性,后續(xù)的操作才能成功:

auth "Redis!123"

這是最基本的安全設(shè)置,建議都做一下這一步驟!也可在連接Redis服務(wù)端的時(shí)候,帶上密碼,順帶完成auth:(但出于安全考慮,不是很推薦)

redis-cli.exe -h 127.0.0.1 -p 6379 -a Redis!123

注:如果在使用Redis客戶端的時(shí)候,需要用到中文,則可以在連接命令后加上--raw參數(shù),如:

redis-cli.exe -h 127.0.0.1 -p 6379 --raw
中文支持

5. Redis中的基本數(shù)據(jù)類型;

Redis支持五種數(shù)據(jù)類型:

  • string(字符串);
  • hash(哈希);
  • list(列表);
  • set(集合);
  • zset(sorted set:有序集合)。

我們一個(gè)一個(gè)來看怎么使用:

1). string;

string 是 redis 最基本的類型,可以包含任何數(shù)據(jù),如jpg圖片或者序列化的對(duì)象,string 類型的值單個(gè)key最大能存儲(chǔ) 512MB。
設(shè)置key-value:

set myTestKey test123

或:

set myTestKey "test123"

取出key:

get myTestKey

設(shè)置多個(gè)key,如:mset set key1 test123 key2 test456
獲取多個(gè)key,如:mget key1 key2
(m代表multiple,即多個(gè)的意思,后面會(huì)多處用到m)。

2). hash;

Redis hash 是一個(gè)鍵值(key=>value)對(duì)集合,是一個(gè) string 類型的 field 和 value 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象,每個(gè) hash 可以存儲(chǔ) 2^32 -1 鍵值對(duì)(40多億)。
設(shè)置key-value:

hset dylan username "dylanz"
hset dylan password "123"

這里的dylan稱之為key,username和password稱之為field,"dylanz"和"123"稱之為value,我們也可一次性設(shè)置多個(gè)field:

hmset dylan username "dylanz" password "123"

獲取key:

hget dylan username
hget dylan password

也可以一次性獲取多個(gè)field:

hmget dylan username password
Redis hash
3). list;

Redis 列表是簡(jiǎn)單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)。列表最多可存儲(chǔ) 232 - 1 元素 (4294967295, 每個(gè)列表可存儲(chǔ)40多億)。

創(chuàng)建列表并在列表頭部插入元素(先進(jìn)后出):

lpush user dylanz
lpush user ritay
lpush user lucash

讀取列表:

lrange user 0 5
lrange user 1 5

創(chuàng)建列表并在列表尾部插入元素(先進(jìn)先出):

rpush location xiamen
rpush location quanzhou
rpush location zhangzhou
Redis list

一次性插入多個(gè)元素:

lpush user dylanz ritay lucash
rpush location xiamen quanzhou zhangzhou
列表的其他命令:
  • Lpop:左邊出棧,獲取列表的第一個(gè)元素(命令完成后,元素就不存在了);
  • Rpop:右邊出棧,獲取列表的最后一個(gè)元素(命令完成后,元素就不存在了);
  • Lindex:根據(jù)索引,取出元素;
  • Llen:鏈表長(zhǎng)度,元素個(gè)數(shù);
  • Lrem:根據(jù)key,刪除n個(gè)value;
  • Ltrim:根據(jù)索引,刪除指定元素;
  • Rpoplpush:出棧,入棧(用于移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回);
  • Lset:根據(jù)index,設(shè)置value(更新);
  • Linsert before:根據(jù)value,在之前插入值;
  • Linsert after:根據(jù)value,在之后插入值;

這些命令在redis-cli命令行窗口下,均有參數(shù)提示,讀者可自行嘗試!

4). set;

Redis 的 Set 是 string 類型的無(wú)序集合。
集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。
集合內(nèi)元素均是唯一性,不可能存在2個(gè)一模一樣的元素!
集合中最大的成員數(shù)為 232 - 1(4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。

添加一個(gè) string 元素到 key 對(duì)應(yīng)的 set 集合中,成功返回 1或大于1,如果元素已經(jīng)在集合中返回 0:

逐個(gè)往Set中添加元素:

sadd job QA
sadd job Engineer
sadd job PM

批量往Set中添加元素:

sadd season Spring Summer Autumn Winter

讀取Set中的元素

smembers job
smembers season
Redis set
5). zset;

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。

添加元素到集合,元素在集合中存在則更新對(duì)應(yīng)score:

zadd school 100 jimei
zadd school 101 xiada
zadd school 102 qinghua

獲取zset中的元素,常規(guī)版:

zrange school 0 5
zrange school 0 -1(獲取所有元素)

獲取zset中的元素,按分?jǐn)?shù)區(qū)間獲?。?/p>

zrangebyscore school 100 102
zrangebyscore shcool 101 102
Redis zset

6. Redis的基本命令;

我們?cè)谏厦娼榻BRedis基本數(shù)據(jù)類型的時(shí)候,已經(jīng)有涉及到很多命令了,這里再匯總、擴(kuò)展一下:

  • ping:用于檢查客戶端是否連接上Redis服務(wù)端;
  • quit:關(guān)閉當(dāng)前連接;
  • del key:用于刪除key;
  • exists key:用于檢查key是否存在;
  • type key:用于獲取key的數(shù)據(jù)類型;
  • rename key newkey:用于修改key的名稱;
  • renamenx key newkey:用于修改key的名稱,且newkey必須為不存在;
  • expire key seconds:用于給key設(shè)置過期時(shí)間,以秒計(jì);
  • expireat key timestamp:用于給key設(shè)置過期時(shí)間點(diǎn),參數(shù)timestamp為以秒計(jì)的UNIX 時(shí)間戳;
  • pexpire key milliseconds:用于給key設(shè)置過期時(shí)間,以毫秒計(jì);
  • pexpireat key milliseconds-timestamp:用于給key設(shè)置過期時(shí)間點(diǎn),參數(shù)timestamp為以毫秒計(jì)的UNIX 時(shí)間戳;
  • ttl key:已秒為單位,返回key的剩余生存時(shí)間(TTL,time to live)
  • pttl key:以毫秒為單位,返回key的剩余生存時(shí)間;
  • keys pattern:查找所有符合給定模式的key;
  • move key db:將key移動(dòng)到給定的數(shù)據(jù)庫(kù)db當(dāng)中;
  • persist key:移除key的過期時(shí)間,key將永久保持,不會(huì)過期;
  • randomkey:從當(dāng)前Redis數(shù)據(jù)庫(kù)中隨機(jī)返回一個(gè)key;
  • SCAN cursor [MATCH pattern] [COUNT count]:令用于迭代數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)鍵;
至此,我們已經(jīng)推開Redis的大門了,當(dāng)然,這還是很初級(jí)的使用,未來我們?cè)偕钊雽W(xué)習(xí),一步一步來。道阻且長(zhǎng),但不忘初心!

下一篇,我將嘗試在Spring Boot項(xiàng)目中集成Redis,敬請(qǐng)期待!

如果本文對(duì)您有幫助,麻煩點(diǎn)贊、關(guān)注!

謝謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。