今天開始進(jìn)入Redis系列學(xué)習(xí)分享
歡迎小伙伴交流學(xué)習(xí),這是第一篇(Redis快速入門之初始Redis–NoSql+安裝redis+客戶端+常用命令),后續(xù)持續(xù)更新
1.初識Redis
Redis是一種鍵值型的NoSql數(shù)據(jù)庫,這里有兩個關(guān)鍵字:
-
鍵值型
-
NoSql
其中鍵值型,是指Redis中存儲的數(shù)據(jù)都是以key、value對的形式存儲,而value的形式多種多樣,可以是字符串、數(shù)值、甚至json:
而NoSql則是相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫而言,有很大差異的一種數(shù)據(jù)庫。
1.1.認(rèn)識NoSQL
NoSql可以翻譯做Not Only Sql(不僅僅是SQL),或者是No Sql(非Sql的)數(shù)據(jù)庫。是相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫而言,有很大差異的一種特殊的數(shù)據(jù)庫,因此也稱之為非關(guān)系型數(shù)據(jù)庫。
1.1.1.結(jié)構(gòu)化與非結(jié)構(gòu)化
傳統(tǒng)關(guān)系型數(shù)據(jù)庫是結(jié)構(gòu)化數(shù)據(jù),每一張表都有嚴(yán)格的約束信息:字段名、字段數(shù)據(jù)類型、字段約束等等信息,插入的數(shù)據(jù)必須遵守這些約束:
而NoSql則對數(shù)據(jù)庫格式?jīng)]有嚴(yán)格約束,往往形式松散,自由。
可以是鍵值型:
也可以是文檔型:
甚至可以是圖格式:
1.1.2.關(guān)聯(lián)和非關(guān)聯(lián)
傳統(tǒng)數(shù)據(jù)庫的表與表之間往往存在關(guān)聯(lián),例如外鍵:
而非關(guān)系型數(shù)據(jù)庫不存在關(guān)聯(lián)關(guān)系,要維護(hù)關(guān)系要么靠代碼中的業(yè)務(wù)邏輯,要么靠數(shù)據(jù)之間的耦合:
{
id: 1,
name: "張三",
orders: [
{
id: 1,
item: {
id: 10, title: "榮耀6", price: 4999
}
},
{
id: 2,
item: {
id: 20, title: "小米11", price: 3999
}
}
]
}
此處要維護(hù)“張三”的訂單與商品“榮耀”和“小米11”的關(guān)系,不得不冗余的將這兩個商品保存在張三的訂單文檔中,不夠優(yōu)雅。還是建議用業(yè)務(wù)來維護(hù)關(guān)聯(lián)關(guān)系。
1.1.3.查詢方式
傳統(tǒng)關(guān)系型數(shù)據(jù)庫會基于Sql語句做查詢,語法有統(tǒng)一標(biāo)準(zhǔn);
而不同的非關(guān)系數(shù)據(jù)庫查詢語法差異極大,五花八門各種各樣。
1.1.4.事務(wù)
傳統(tǒng)關(guān)系型數(shù)據(jù)庫能滿足事務(wù)ACID的原則。
而非關(guān)系型數(shù)據(jù)庫往往不支持事務(wù),或者不能嚴(yán)格保證ACID的特性,只能實現(xiàn)基本的一致性。
1.1.5.總結(jié)
除了上述四點以外,在存儲方式、擴(kuò)展性、查詢性能上關(guān)系型與非關(guān)系型也都有著顯著差異,總結(jié)如下:
- 存儲方式
- 關(guān)系型數(shù)據(jù)庫基于磁盤進(jìn)行存儲,會有大量的磁盤IO,對性能有一定影響
- 非關(guān)系型數(shù)據(jù)庫,他們的操作更多的是依賴于內(nèi)存來操作,內(nèi)存的讀寫速度會非???,性能自然會好一些
- 擴(kuò)展性
- 關(guān)系型數(shù)據(jù)庫集群模式一般是主從,主從數(shù)據(jù)一致,起到數(shù)據(jù)備份的作用,稱為垂直擴(kuò)展。
- 非關(guān)系型數(shù)據(jù)庫可以將數(shù)據(jù)拆分,存儲在不同機(jī)器上,可以保存海量數(shù)據(jù),解決內(nèi)存大小有限的問題。稱為水平擴(kuò)展。
- 關(guān)系型數(shù)據(jù)庫因為表之間存在關(guān)聯(lián)關(guān)系,如果做水平擴(kuò)展會給數(shù)據(jù)查詢帶來很多麻煩
1.2.認(rèn)識Redis
Redis誕生于2009年全稱是Remote Dictionary Server 遠(yuǎn)程詞典服務(wù)器,是一個基于內(nèi)存的鍵值型NoSQL數(shù)據(jù)庫。
特征:
- 鍵值(key-value)型,value支持多種不同數(shù)據(jù)結(jié)構(gòu),功能豐富
- 單線程,每個命令具備原子性
- 低延遲,速度快(基于內(nèi)存、IO多路復(fù)用、良好的編碼)。
- 支持?jǐn)?shù)據(jù)持久化
- 支持主從集群、分片集群
- 支持多語言客戶端
Redis的官方網(wǎng)站地址:https://redis.io/
1.3.安裝Redis
大多數(shù)企業(yè)都是基于Linux服務(wù)器來部署項目,而且Redis官方也沒有提供Windows版本的安裝包。因此我基于Linux系統(tǒng)來安裝Redis.
此處選擇的Linux版本為CentOS 7.
1.3.1.依賴庫
Redis是基于C語言編寫的,因此首先需要安裝Redis所需要的gcc依賴:
yum install -y gcc tcl
1.3.2.上傳安裝包并解壓
然后將Redis安裝包上傳到虛擬機(jī)的任意目錄:
例如,我放到了/usr/local/src 目錄:
解壓縮:
tar -xzf redis-6.2.6.tar.gz
解壓后:
進(jìn)入redis目錄:
cd redis-6.2.6
運行編譯命令:
make && make install
如果沒有出錯,應(yīng)該就安裝成功了。
默認(rèn)的安裝路徑是在 /usr/local/bin
目錄下:
該目錄已經(jīng)默認(rèn)配置到環(huán)境變量,因此可以在任意目錄下運行這些命令。其中:
- redis-cli:是redis提供的命令行客戶端
- redis-server:是redis的服務(wù)端啟動腳本
- redis-sentinel:是redis的哨兵啟動腳本
1.3.3.啟動
redis的啟動方式有很多種,例如:
- 默認(rèn)啟動
- 指定配置啟動
- 開機(jī)自啟
1.3.4.默認(rèn)啟動
安裝完成后,在任意目錄輸入redis-server命令即可啟動Redis:
redis-server
如圖:
這種啟動屬于前臺啟動
,會阻塞整個會話窗口,窗口關(guān)閉或者按下CTRL + C
則Redis停止。不推薦使用。
1.3.5.指定配置啟動
如果要讓Redis以后臺
方式啟動,則必須修改Redis配置文件,就在我們之前解壓的redis安裝包下(/usr/local/src/redis-6.2.6
),名字叫redis.conf:
我們先將這個配置文件備份一份:
cp redis.conf redis.conf.bck
然后修改redis.conf文件中的一些配置:
# 允許訪問的地址,默認(rèn)是127.0.0.1,會導(dǎo)致只能在本地訪問。修改為0.0.0.0則可以在任意IP訪問,生產(chǎn)環(huán)境不要設(shè)置為0.0.0.0
bind 0.0.0.0
# 守護(hù)進(jìn)程,修改為yes后即可后臺運行
daemonize yes
# 密碼,設(shè)置后訪問Redis必須輸入密碼
requirepass 123321
Redis的其它常見配置:
# 監(jiān)聽的端口
port 6379
# 工作目錄,默認(rèn)是當(dāng)前目錄,也就是運行redis-server時的命令,日志、持久化等文件會保存在這個目錄
dir .
# 數(shù)據(jù)庫數(shù)量,設(shè)置為1,代表只使用1個庫,默認(rèn)有16個庫,編號0~15
databases 1
# 設(shè)置redis能夠使用的最大內(nèi)存
maxmemory 512mb
# 日志文件,默認(rèn)為空,不記錄日志,可以指定日志文件名
logfile "redis.log"
啟動Redis:
# 進(jìn)入redis安裝目錄
cd /usr/local/src/redis-6.2.6
# 啟動
redis-server redis.conf
停止服務(wù):
# 利用redis-cli來執(zhí)行 shutdown 命令,即可停止 Redis 服務(wù),
# 因為之前配置了密碼,因此需要通過 -u 來指定密碼
redis-cli -u 123321 shutdown
1.3.6.開機(jī)自啟
我們也可以通過配置來實現(xiàn)開機(jī)自啟。
首先,新建一個系統(tǒng)服務(wù)文件:
vi /etc/systemd/system/redis.service
內(nèi)容如下:
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后重載系統(tǒng)服務(wù):
systemctl daemon-reload
現(xiàn)在,我們可以用下面這組命令來操作redis了:
# 啟動
systemctl start redis
# 停止
systemctl stop redis
# 重啟
systemctl restart redis
# 查看狀態(tài)
systemctl status redis
執(zhí)行下面的命令,可以讓redis開機(jī)自啟:
systemctl enable redis
1.4.Redis桌面客戶端
安裝完成Redis,我們就可以操作Redis,實現(xiàn)數(shù)據(jù)的CRUD了。這需要用到Redis客戶端,包括:
- 命令行客戶端
- 圖形化桌面客戶端
- 編程客戶端
1.4.1.Redis命令行客戶端
Redis安裝完成后就自帶了命令行客戶端:redis-cli,使用方式如下:
redis-cli [options] [commonds]
其中常見的options有:
-
-h 127.0.0.1
:指定要連接的redis節(jié)點的IP地址,默認(rèn)是127.0.0.1 -
-p 6379
:指定要連接的redis節(jié)點的端口,默認(rèn)是6379 -
-a 123321
:指定redis的訪問密碼
其中的commonds就是Redis的操作命令,例如:
-
ping
:與redis服務(wù)端做心跳測試,服務(wù)端正常會返回pong
不指定commond時,會進(jìn)入redis-cli
的交互控制臺:
1.4.2.圖形化桌面客戶端
GitHub上的大神編寫了Redis的圖形化桌面客戶端,地址:https://github.com/uglide/RedisDesktopManager
不過該倉庫提供的是RedisDesktopManager的源碼,并未提供windows安裝包。
在下面這個倉庫可以找到安裝包:https://github.com/lework/RedisDesktopManager-Windows/releases
1.4.3.安裝
找到Redis的圖形化桌面客戶端(沒有的伙伴可以私聊我):
解壓縮后,運行安裝程序即可安裝:
安裝完成后,在安裝目錄下找到rdm.exe文件:
雙擊即可運行:
1.4.4.建立連接
點擊左上角的連接到Redis服務(wù)器
按鈕:
在彈出的窗口中填寫Redis服務(wù)信息:
點擊確定后,在左側(cè)菜單會出現(xiàn)這個鏈接:
點擊即可建立連接了。
Redis默認(rèn)有16個倉庫,編號從0至15. 通過配置文件可以設(shè)置倉庫數(shù)量,但是不超過16,并且不能自定義倉庫名稱。
如果是基于redis-cli連接Redis服務(wù),可以通過select命令來選擇數(shù)據(jù)庫:
# 選擇 0號庫
select 0
2.Redis常見命令
Redis是典型的key-value數(shù)據(jù)庫,key一般是字符串,而value包含很多不同的數(shù)據(jù)類型:
Redis為了方便我們學(xué)習(xí),將操作不同數(shù)據(jù)類型的命令也做了分組,在官網(wǎng)( https://redis.io/commands )可以查看到不同的命令:
不同類型的命令稱為一個group,我們也可以通過help命令來查看各種不同group的命令:
接下來,我們就學(xué)習(xí)常見的五種基本數(shù)據(jù)類型的相關(guān)命令。
2.1.Redis通用命令
通用指令是部分?jǐn)?shù)據(jù)類型的,都可以使用的指令,常見的有:
- KEYS:查看符合模板的所有key
- DEL:刪除一個指定的key
- EXISTS:判斷key是否存在
- EXPIRE:給一個key設(shè)置有效期,有效期到期時該key會被自動刪除
- TTL:查看一個KEY的剩余有效期
通過help [command] 可以查看一個命令的具體用法,例如:
# 查看keys命令的幫助信息:
127.0.0.1:6379> help keys
KEYS pattern
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic
2.2.String類型
String類型,也就是字符串類型,是Redis中最簡單的存儲類型。
其value是字符串,不過根據(jù)字符串的格式不同,又可以分為3類:
- string:普通字符串
- int:整數(shù)類型,可以做自增、自減操作
- float:浮點類型,可以做自增、自減操作
不管是哪種格式,底層都是字節(jié)數(shù)組形式存儲,只不過是編碼方式不同。字符串類型的最大空間不能超過512m.
2.2.1.String的常見命令
String的常見命令有:
- SET:添加或者修改已經(jīng)存在的一個String類型的鍵值對
- GET:根據(jù)key獲取String類型的value
- MSET:批量添加多個String類型的鍵值對
- MGET:根據(jù)多個key獲取多個String類型的value
- INCR:讓一個整型的key自增1
- INCRBY:讓一個整型的key自增并指定步長,例如:incrby num 2 讓num值自增2
- INCRBYFLOAT:讓一個浮點類型的數(shù)字自增并指定步長
- SETNX:添加一個String類型的鍵值對,前提是這個key不存在,否則不執(zhí)行
- SETEX:添加一個String類型的鍵值對,并且指定有效期
2.2.2.Key結(jié)構(gòu)
Redis沒有類似MySQL中的Table的概念,我們該如何區(qū)分不同類型的key呢?
例如,需要存儲用戶、商品信息到redis,有一個用戶id是1,有一個商品id恰好也是1,此時如果使用id作為key,那就會沖突了,該怎么辦?
我們可以通過給key添加前綴加以區(qū)分,不過這個前綴不是隨便加的,有一定的規(guī)范:
Redis的key允許有多個單詞形成層級結(jié)構(gòu),多個單詞之間用’:'隔開,格式如下:
項目名:業(yè)務(wù)名:類型:id
這個格式并非固定,也可以根據(jù)自己的需求來刪除或添加詞條。這樣以來,我們就可以把不同類型的數(shù)據(jù)區(qū)分開了。從而避免了key的沖突問題。
例如我們的項目名稱叫 heima,有user和product兩種不同類型的數(shù)據(jù),我們可以這樣定義key:
-
user相關(guān)的key:heima:user:1
-
product相關(guān)的key:heima:product:1
如果Value是一個Java對象,例如一個User對象,則可以將對象序列化為JSON字符串后存儲:
KEY | VALUE |
---|---|
heima:user:1 | {“id”:1, “name”: “Jack”, “age”: 21} |
heima:product:1 | {“id”:1, “name”: “小米11”, “price”: 4999} |
并且,在Redis的桌面客戶端中,還會以相同前綴作為層級結(jié)構(gòu),讓數(shù)據(jù)看起來層次分明,關(guān)系清晰:
2.3.Hash類型
Hash類型,也叫散列,其value是一個無序字典,類似于Java中的HashMap結(jié)構(gòu)。
String結(jié)構(gòu)是將對象序列化為JSON字符串后存儲,當(dāng)需要修改對象某個字段時很不方便:
Hash結(jié)構(gòu)可以將對象中的每個字段獨立存儲,可以針對單個字段做CRUD:
Hash的常見命令有:
-
HSET key field value:添加或者修改hash類型key的field的值
-
HGET key field:獲取一個hash類型key的field的值
-
HMSET:批量添加多個hash類型key的field的值
-
HMGET:批量獲取多個hash類型key的field的值
-
HGETALL:獲取一個hash類型的key中的所有的field和value
-
HKEYS:獲取一個hash類型的key中的所有的field
-
HINCRBY:讓一個hash類型key的字段值自增并指定步長
-
HSETNX:添加一個hash類型的key的field值,前提是這個field不存在,否則不執(zhí)行
2.4.List類型
Redis中的List類型與Java中的LinkedList類似,可以看做是一個雙向鏈表結(jié)構(gòu)。既可以支持正向檢索和也可以支持反向檢索。
特征也與LinkedList類似:
- 有序
- 元素可以重復(fù)
- 插入和刪除快
- 查詢速度一般
常用來存儲一個有序數(shù)據(jù),例如:朋友圈點贊列表,評論列表等。
List的常見命令有:
- LPUSH key element … :向列表左側(cè)插入一個或多個元素
- LPOP key:移除并返回列表左側(cè)的第一個元素,沒有則返回nil
- RPUSH key element … :向列表右側(cè)插入一個或多個元素
- RPOP key:移除并返回列表右側(cè)的第一個元素
- LRANGE key star end:返回一段角標(biāo)范圍內(nèi)的所有元素
- BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil
2.5.Set類型
Redis的Set結(jié)構(gòu)與Java中的HashSet類似,可以看做是一個value為null的HashMap。因為也是一個hash表,因此具備與HashSet類似的特征:
- 無序
- 元素不可重復(fù)
- 查找快
- 支持交集、并集、差集等功能
Set的常見命令有:
- SADD key member … :向set中添加一個或多個元素
- SREM key member … : 移除set中的指定元素
- SCARD key: 返回set中元素的個數(shù)
- SISMEMBER key member:判斷一個元素是否存在于set中
- SMEMBERS:獲取set中的所有元素
- SINTER key1 key2 … :求key1與key2的交集
例如兩個集合:s1和s2:
求交集:SINTER s1 s2
求s1與s2的不同:SDIFF s1 s2
下面給一些練習(xí)(需要答案可以私聊哦):
- 將下列數(shù)據(jù)用Redis的Set集合來存儲:
- 張三的好友有:李四、王五、趙六
- 李四的好友有:王五、麻子、二狗
- 利用Set的命令實現(xiàn)下列功能:
- 計算張三的好友有幾人
- 計算張三和李四有哪些共同好友
- 查詢哪些人是張三的好友卻不是李四的好友
- 查詢張三和李四的好友總共有哪些人
- 判斷李四是否是張三的好友
- 判斷張三是否是李四的好友
- 將李四從張三的好友列表中移除
2.6.SortedSet類型
Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層數(shù)據(jù)結(jié)構(gòu)卻差別很大。SortedSet中的每一個元素都帶有一個score屬性,可以基于score屬性對元素排序,底層的實現(xiàn)是一個跳表(SkipList)加 hash表。
SortedSet具備下列特性:
- 可排序
- 元素不重復(fù)
- 查詢速度快
因為SortedSet的可排序特性,經(jīng)常被用來實現(xiàn)排行榜這樣的功能。
SortedSet的常見命令有:
- ZADD key score member:添加一個或多個元素到sorted set ,如果已經(jīng)存在則更新其score值
- ZREM key member:刪除sorted set中的一個指定元素
- ZSCORE key member : 獲取sorted set中的指定元素的score值
- ZRANK key member:獲取sorted set 中的指定元素的排名
- ZCARD key:獲取sorted set中的元素個數(shù)
- ZCOUNT key min max:統(tǒng)計score值在給定范圍內(nèi)的所有元素的個數(shù)
- ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
- ZRANGE key min max:按照score排序后,獲取指定排名范圍內(nèi)的元素
- ZRANGEBYSCORE key min max:按照score排序后,獲取指定score范圍內(nèi)的元素
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:所有的排名默認(rèn)都是升序,如果要降序則在命令的Z后面添加REV即可,例如:
-
升序獲取sorted set 中的指定元素的排名:ZRANK key member
-
降序獲取sorted set 中的指定元素的排名:ZREVRANK key memeber
練習(xí)題(需要答案可以私聊我哦):
將班級的下列學(xué)生得分存入Redis的SortedSet中:
Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76
并實現(xiàn)下列功能:
- 刪除Tom同學(xué)
- 獲取Amy同學(xué)的分?jǐn)?shù)
- 獲取Rose同學(xué)的排名
- 查詢80分以下有幾個學(xué)生
- 給Amy同學(xué)加2分
- 查出成績前3名的同學(xué)
- 查出成績80分以下的所有同學(xué)
感謝閱讀
感謝您閱讀 Redis 學(xué)習(xí)系列的第一篇!在這篇文章中,我們探索了Redis的(快速入門之初始Redis–>了解NoSql+安裝redis+客戶端+常用命令)
下一篇文章即將發(fā)布! 在第二篇中,我們將深入研究–>Redis的Java客戶端等系列知識,為您分享我學(xué)習(xí)的Redis的收獲,請繼續(xù)關(guān)注我的系列。
謝謝您的陪伴! 如果您有任何問題、建議或想要了解的特定主題系列,請隨時在評論中告訴我。我期待與您共同探索java,共同提升我們的Java開發(fā)技能!文章來源:http://www.zghlxwxcb.cn/news/detail-828987.html
學(xué)習(xí)資料來源黑馬程序員Redis視頻學(xué)習(xí),如有侵權(quán)聯(lián)系我刪除文章來源地址http://www.zghlxwxcb.cn/news/detail-828987.html
到了這里,關(guān)于Redis系列學(xué)習(xí)文章分享---第一篇(Redis快速入門之初始Redis--NoSql+安裝redis+客戶端+常用命令)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!