Redis 簡(jiǎn)介
Redis(Remote Dictionary Server)是一個(gè)開(kāi)源的高性能鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫(kù),最初由 Salvatore Sanfilippo 開(kāi)發(fā),它在內(nèi)存中存儲(chǔ)數(shù)據(jù),并提供了持久化功能,可以將數(shù)據(jù)保存到磁盤(pán)中,是一種NoSQL(not-only sql,非關(guān)系型數(shù)據(jù)庫(kù))的數(shù)據(jù)庫(kù)。
它的數(shù)據(jù)結(jié)構(gòu)十分豐富,基礎(chǔ)數(shù)據(jù)類(lèi)型包括:string(字符串)、list(列表,雙向鏈表)、hash(散列,鍵值對(duì)集合)、set(集合,不重復(fù))和 sorted set(有序集合),這使得它不僅僅是一個(gè)簡(jiǎn)單的鍵值存儲(chǔ),還可以用于存儲(chǔ)和處理復(fù)雜的數(shù)據(jù)。
數(shù)據(jù)類(lèi)型和底層結(jié)構(gòu)的對(duì)應(yīng)關(guān)系
string | list | hash | set | sorted set |
---|
簡(jiǎn)單動(dòng)態(tài)字符串 | 雙向鏈表、壓縮鏈表 | 壓縮鏈表、哈希表 | 壓縮鏈表、整數(shù)數(shù)組 | 壓縮鏈表、跳表 |
底層實(shí)現(xiàn)的時(shí)間復(fù)雜度
跳表 | 雙向鏈表 | 壓縮鏈表 | 哈希表 | 整數(shù)數(shù)組 |
---|
O(logN) | O(N) | O(N) | O(1) | O(N) |
可以看出除了 string 類(lèi)型的底層實(shí)現(xiàn)只有一種數(shù)據(jù)結(jié)構(gòu),其他四種均有兩種底層實(shí)現(xiàn),這四種類(lèi)型為集合類(lèi)型,其中一個(gè)鍵對(duì)應(yīng)了一個(gè)集合的數(shù)據(jù)。
Redis 特點(diǎn)/優(yōu)勢(shì)
Redis 具備許多特點(diǎn)和優(yōu)勢(shì),所以在大規(guī)模應(yīng)用和高并發(fā)場(chǎng)景中得到廣泛應(yīng)用。
- 豐富的數(shù)據(jù)結(jié)構(gòu):Redis 支持多種數(shù)據(jù)結(jié)構(gòu),包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。每種數(shù)據(jù)結(jié)構(gòu)都有豐富的操作命令,可以方便地對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和處理。
- 持久化:Redis 提供了兩種持久化方式,RDB(Redis Database)和 AOF(Append Only File)。RDB 是將數(shù)據(jù)庫(kù)在指定時(shí)間點(diǎn)轉(zhuǎn)儲(chǔ)到磁盤(pán)的快照持久化方式,AOF 是將寫(xiě)操作追加到文件末尾的日志持久化方式。這兩種方式可以根據(jù)需求進(jìn)行選擇,保證數(shù)據(jù)在服務(wù)器重啟后不會(huì)丟失。
- 高性能:Redis 是一種內(nèi)存數(shù)據(jù)庫(kù),數(shù)據(jù)存儲(chǔ)在內(nèi)存中,因此讀寫(xiě)速度非???。它采用單線(xiàn)程模型,避免了多線(xiàn)程帶來(lái)的競(jìng)爭(zhēng)問(wèn)題,使得 Redis 能夠充分利用 CPU 和內(nèi)存資源。
- 支持事務(wù):Redis 支持事務(wù)操作,可以將多個(gè)命令打包執(zhí)行,保證這些命令要么全部執(zhí)行成功,要么全部失敗,保持?jǐn)?shù)據(jù)的一致性。雖然 Redis 在單個(gè)命令的執(zhí)行上是原子性的,但是多個(gè)命令的組合并不是原子性的,通過(guò)事務(wù)可以實(shí)現(xiàn)一組命令的原子性執(zhí)行。
- 高可用與分布式:Redis 支持主從復(fù)制、哨兵和集群等功能,可以構(gòu)建高可用和分布式的 Redis 架構(gòu)。主從復(fù)制可以實(shí)現(xiàn)數(shù)據(jù)的熱備份和讀寫(xiě)分離,哨兵可以監(jiān)控 Redis 的健康狀態(tài)并進(jìn)行自動(dòng)故障轉(zhuǎn)移,集群可以將數(shù)據(jù)分布在多個(gè)節(jié)點(diǎn)上,提高性能和擴(kuò)展性。
- 發(fā)布訂閱:Redis 支持發(fā)布訂閱模式,可以實(shí)現(xiàn)消息的發(fā)布和訂閱。發(fā)布者將消息發(fā)布到指定的頻道,訂閱者可以訂閱感興趣的頻道并接收相應(yīng)的消息,實(shí)現(xiàn)了解耦和實(shí)時(shí)通信。
Redis 為什么很快
- 內(nèi)存存儲(chǔ):Redis將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,而不是像傳統(tǒng)的磁盤(pán)存儲(chǔ)數(shù)據(jù)庫(kù)那樣將數(shù)據(jù)寫(xiě)入到硬盤(pán)上。由于內(nèi)存的讀寫(xiě)速度遠(yuǎn)遠(yuǎn)快于磁盤(pán),因此Redis能夠?qū)崿F(xiàn)極快的讀寫(xiě)性能。
- 單線(xiàn)程模型:Redis采用單線(xiàn)程模型,每個(gè)Redis實(shí)例都由單個(gè)主線(xiàn)程來(lái)處理所有的客戶(hù)端請(qǐng)求。雖然單線(xiàn)程看起來(lái)似乎會(huì)限制其性能,但這實(shí)際上是Redis的一大優(yōu)勢(shì)。單線(xiàn)程模型消除了多線(xiàn)程之間的競(jìng)爭(zhēng)和鎖等開(kāi)銷(xiāo),使得Redis能夠充分利用CPU資源,并且避免了多線(xiàn)程帶來(lái)的復(fù)雜性。此外,Redis在內(nèi)部使用了I/O多路復(fù)用技術(shù)(例如epoll或kqueue)來(lái)處理并發(fā)請(qǐng)求,使得單線(xiàn)程能夠同時(shí)處理多個(gè)客戶(hù)端連接。
- 非阻塞IO:Redis使用了非阻塞IO,也就是在讀寫(xiě)操作時(shí)不會(huì)阻塞其他操作。在讀取數(shù)據(jù)時(shí),如果內(nèi)存中沒(méi)有所需的數(shù)據(jù),Redis會(huì)立即返回一個(gè)空結(jié)果,而不會(huì)等待數(shù)據(jù)從磁盤(pán)加載進(jìn)來(lái)。這樣即使在高并發(fā)情況下,Redis也能夠快速地響應(yīng)請(qǐng)求。
- 高效的數(shù)據(jù)結(jié)構(gòu):Redis支持多種高效的數(shù)據(jù)結(jié)構(gòu),比如字符串、哈希、列表、集合、有序集合等。這些數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)都非常高效,能夠在常量時(shí)間內(nèi)完成查找、插入、刪除等操作,保證了Redis的高速性能。
- 異步操作:Redis支持異步操作,比如異步持久化和異步復(fù)制。異步操作能夠讓Redis在進(jìn)行磁盤(pán)持久化和主從復(fù)制時(shí)不會(huì)阻塞其他操作,提高了整體的性能。
- 優(yōu)化的網(wǎng)絡(luò)協(xié)議:Redis使用RESP(Redis Serialization Protocol)作為網(wǎng)絡(luò)協(xié)議,RESP是一種簡(jiǎn)單、高效的二進(jìn)制協(xié)議。RESP協(xié)議的設(shè)計(jì)使得網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量盡可能地減少,減少了網(wǎng)絡(luò)傳輸?shù)拈_(kāi)銷(xiāo),提高了性能。
- 原子性操作:Redis支持很多原子性操作,比如INCR、DECR、SETNX等。原子性操作能夠在一條命令中完成多個(gè)操作,而且這些操作是不可中斷的,保證了數(shù)據(jù)的一致性。
應(yīng)用場(chǎng)景
由于 Redis 具備高性能、豐富的數(shù)據(jù)結(jié)構(gòu)和多種特性,它的主要應(yīng)用場(chǎng)景如下:
- 緩存:作為緩存數(shù)據(jù)庫(kù),Redis 可以將經(jīng)常訪(fǎng)問(wèn)的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,避免頻繁讀寫(xiě)數(shù)據(jù)庫(kù),提高應(yīng)用的響應(yīng)速度。緩存可以存儲(chǔ)熱點(diǎn)數(shù)據(jù),減輕后端數(shù)據(jù)庫(kù)的壓力,提高系統(tǒng)的吞吐量。
- 計(jì)數(shù)器:利用 Redis 的原子性操作,可以實(shí)現(xiàn)高效的計(jì)數(shù)器功能,比如網(wǎng)站的點(diǎn)贊、瀏覽次數(shù)等統(tǒng)計(jì)功能。由于 Redis 原子性操作的特性,計(jì)數(shù)器的更新可以并發(fā)執(zhí)行而不會(huì)出現(xiàn)競(jìng)爭(zhēng)問(wèn)題。
- 消息隊(duì)列:Redis 的發(fā)布訂閱功能和列表數(shù)據(jù)結(jié)構(gòu)可以實(shí)現(xiàn)簡(jiǎn)單的消息隊(duì)列,用于解耦系統(tǒng)的各個(gè)模塊。生產(chǎn)者將消息發(fā)布到指定頻道,消費(fèi)者訂閱感興趣的頻道并處理消息,實(shí)現(xiàn)異步消息傳遞。
- 排行榜:使用有序集合數(shù)據(jù)結(jié)構(gòu),可以實(shí)現(xiàn)排行榜功能,比如游戲中的玩家排名。通過(guò)有序集合的分?jǐn)?shù)屬性,可以對(duì)玩家的得分進(jìn)行排序和排名,實(shí)時(shí)顯示排行榜。
- 會(huì)話(huà)緩存:在 Web 應(yīng)用中,可以使用 Redis 存儲(chǔ)用戶(hù)的會(huì)話(huà)數(shù)據(jù),實(shí)現(xiàn)分布式會(huì)話(huà)管理。用戶(hù)登錄后,可以將會(huì)話(huà)數(shù)據(jù)存儲(chǔ)在 Redis 中,從而實(shí)現(xiàn)多臺(tái)服務(wù)器之間的會(huì)話(huà)共享。
- 微信搜索公眾號(hào):架構(gòu)師指南,回復(fù):架構(gòu)師 領(lǐng)取資料 。
如何安裝和使用
安裝 Redis 非常簡(jiǎn)單,可以通過(guò)官方網(wǎng)站下載源代碼進(jìn)行編譯安裝,也可以使用包管理工具安裝。對(duì)于 Ubuntu 系統(tǒng),可以使用以下命令安裝 Redis:
bashCopy codesudo apt update
sudo apt install redis-server
安裝完成后,可以使用以下命令啟動(dòng) Redis 服務(wù):
bashCopy code
sudo systemctl start redis-server
連接 Redis 服務(wù)器可以使用 redis-cli
命令行工具:
bashCopy code
redis-cli
5. 常用命令
bashCopy code
SET key value
bashCopy code
GET key
bashCopy code
SETEX key seconds value
bashCopy code
DEL key
bashCopy codeLPUSH list_key value1 value2 value3 # 從左側(cè)插入元素
RPUSH list_key value4 value5 # 從右側(cè)插入元素
LRANGE list_key 0 -1 # 獲取所有元素
總結(jié)
Redis 是一款功能強(qiáng)大且廣泛應(yīng)用于各種場(chǎng)景的內(nèi)存數(shù)據(jù)庫(kù)。它的快速讀寫(xiě)性能、豐富的數(shù)據(jù)結(jié)構(gòu)和多種特性使得它成為處理高速數(shù)據(jù)和構(gòu)建高可用、分布式系統(tǒng)的理想選擇。無(wú)論是作為緩存、計(jì)數(shù)器、消息隊(duì)列還是會(huì)話(huà)緩存,Redis 都能發(fā)揮出色的性能。
原文鏈接:https://mp.weixin.qq.com/s/hdlkr6a6khJ7tnQ7Zqx5Gg(版權(quán)歸原作者所有,侵刪)
-End-
該文章在 2023/12/4 11:58:05 編輯過(guò)