Redis基礎知識十問十答

2021-10-08 11:50:53 字數 4977 閱讀 4213

redis 是當前比較流行的非關係型資料庫(nosql)。非關係型資料庫是資料結構化儲存的集合,它具有格式靈活、速度快、高擴充套件性的優點,而且redis是基於記憶體的非關係型資料庫,效能出色,每秒可以處理超過10萬次讀寫操作。所以它非常適合網際網路專案,為網際網路相關系統提公升效能。下面,我們就來學習一下redis的基礎知識:

redis(remote dictionary server【遠端資料服務】):是乙個基於記憶體的高效能key-value資料庫。

redis把整個資料庫載入到記憶體當中,通過定期的非同步操作把資料庫資料flush到硬碟上進行儲存。

i. 效能出色,每秒可以處理超過 10萬次讀寫操作,是已知效能最快的key-value db(因為載入記憶體中);

ii. 支援儲存多種資料結構,此外單個value的最大限制是1gb;

iii. 支援事務;支援key設定expire(到期)時間;

redis資料庫容量受到物理記憶體的限制,不能用作海量資料的高效能讀寫。

少量高頻資料的儲存,高速讀寫訪問(系統中資料字典資訊)。

i. 記憶體,快;k,

v ii. 單執行緒,指的是worker

執行緒(即符合序列化處理);但

6.x以後多執行緒,但只是

io是多執行緒,

worker

還是單執行緒;

iii. 連線很多:epoll

(多路復用);

iv. value有型別(

5種),且每種型別有自己本地方法(

get、

index);

v. 本地方法:計算向資料移動,其實是io

優化;

vi. 整體模型是一種序列化,盡量保持原子性。

給儲存在redis記憶體中的資料起的變數名字,命名規則:除了空格、

\n換行外其它的大部分字元都可以使用,但是名字盡量有意義。

二進位制安全的string,最大容量

512m。

應用場景:

json

字串化儲存。

string型別的list,list允許使用者從序列的兩端推入或者彈出元素,list是由多個字串組成的有序可重複的序列,是鍊錶結構。

應用場景:最新訊息排行榜;訊息佇列(完成多程式之間的訊息交換),可以用

push

操作將任務存在

list

中(生產者),然後執行緒在用

pop操作將任務取出進行執行。(消費者)

string型別的set,無序不可重複的,它的優勢:進行交集並集差集操作。

應用場景:

string型別的sortset,有序不可重複的。

應用場景:

hash可以看成具有string key和string value的map容器

應用場景:儲存、讀取、修改使用者屬性(name,age,pwd等)

redis兩種持久化機制:rdb持久化(預設), aof持久化。

使用快照的方式(半持久化模式)記錄redis資料庫的所有鍵值對,在某個時間點將資料寫入乙個臨時檔案,用臨時檔案替換上次持久化的檔案,恢復資料。 

優點:方便持久化(只有乙個檔案dump.rdb)、容災性好(乙個檔案可以儲存到安全的磁碟)、效能最大化、資料集大時,比

aof的啟動效率更高。 

缺點:資料安全性低 (rdb是間隔一段時間進行持久化,如果持久化之間redis發生故障,會發生資料丟失。所以這種方式更適合資料要求不嚴謹的時候)

把使用者執行的每個「寫」指令(新增/修改/刪除)都備份到檔案中,還原資料的時候就是執行具體寫指令而已。

優點:資料安全、資料一致性

缺點:aof

檔案比rdb

檔案大,且恢復速度慢、資料集大的時,比

rdb效率低。

redis作為快取時, 如果記憶體空間用滿, 就會自動驅逐老的資料。redis使用maxmemory指令或配置檔案,設定最大使用記憶體。

noeviction(不刪除策略):達到最大記憶體限制時,如果需要更多記憶體,直接返回錯誤資訊(大部分的寫入指令,但del和幾個例外)

allkeys-lru:所有key通用; 優先刪除最近最少使用(less recently used ,lru)的 key。

allkeys-random所有key通用; 隨機刪除一部分 key。

volatile-lru:只限於設定了expire的key,優先刪除最近最少使用(lru) 的 key。

volatile-random:只限於設定了 expire 的key,隨機刪除一部分 key。

volatile-ttl:只限於設定了expire的key,優先**存活時間(ttl)較短的鍵,使得新新增的資料有空間存放。

tips

如果沒有設定

expire 

的key

,不滿足先決條件,

volatile-*

相關策略與

noeviction

策略基本上一致。

redis設定過期時間四種命令:

expire : 將鍵的生存時間設為 ttl 秒

pexpire : 將鍵的生存時間設為 ttl 毫秒

expireat : 將鍵的過期時間設為 timestamp 所指定的秒數時間戳

pexpireat : 將鍵的過期時間設為 timestamp 所指定的毫秒數時間戳

移除過期時間命令:

persist key_name:persist命令就是expire命令的反命令,這個函式在過期字典中查詢給定的鍵,並從過期字典中移除

ttl key_name : ttl命令(以秒返回)

pttl key_name : pttl命令(以毫秒返回)

概念:

概念:平時放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。

實現:由db.c/expirelfneeded 函式實現,所有讀寫資料庫的redis命令在執行之前都會呼叫該函式對輸入鍵進行檢查:如果輸入鍵已經過期,那麼該函式將輸入鍵從資料庫中刪除;反之該函式不做動作。

概念:每隔一段時間程式就對資料庫進行一次檢查,刪除裡面的過期鍵。

實現:由redis.c/activeexpirecycle 函式實現,redis執行週期性該函式,它在規定的時間內,分多次遍歷伺服器中的各個資料庫,從資料庫的expires 字典中隨機檢查一部分鍵的過期時間,並刪除其中的過期鍵。

redis實際使用的是惰性刪除和定期刪除兩種策略: 通過配合使用這兩種刪除策略,伺服器可以很好地在合理使用cpu時間和避免浪費記憶體空間之間取得平衡。

最常用的場景。它比其他儲存(如memcached)的優勢:redis提供持久化。例如:快取使用者的購物車資訊(維護乙個不是嚴格要求一致性的快取)

全頁快取的概念:快取曾經瀏覽過的頁面。

redis提供簡便的fpc平台。並且redis提供持久化,即使重啟了redis例項,使用者也不會看到頁面載入速度的下降。

reids在記憶體儲存引擎提供 list 和 set 操作,這使得redis能作為乙個很好的訊息佇列平台來使用。

redis在記憶體中對數字的遞增或遞減的操作非常好。redis又提供了集合(set)和有序集合(sorted set)兩種資料結構。

redis的發布/訂閱功能。

redis是單程序單執行緒的,redis利用佇列技術將併發訪問變為序列訪問,消除了傳統資料庫序列控制的開銷。

為了達到最快的讀寫速度,減少磁碟i/o對速度的影響。

盡可能使用雜湊表(hashes),雜湊表使用的記憶體非常小,所以應該盡可能的將你的資料模型抽象到乙個雜湊表裡面。例如,使用者物件,不要把每乙個屬性當做key值儲存,要把整個使用者資訊雜湊單一張表裡。

讀操作:先從redis中讀取資料,如果redis不存在,再到db中去讀資料。

插入操作:插入資料時,只對資料庫進行操作,不使用redis進行快取。這樣就避免了redis的髒資料,讀操作時,再把這條資料快取到redis中。

更新操作:先對db進行更新操作,然後將redis快取的資料設定為無效(expire

命令),讀操作時,再把這條資料快取到redis中。

概念:單個key在快取中查不到,去資料庫查詢。如果資料量不大或併發不大沒有問題,反之,可能造成資料庫壓力過大而崩潰(這裡是單個

key發生高併發)。

解決:使用同步鎖,每次只讓乙個key去查詢,堵塞其他; 使用互斥鎖。

概念:查詢乙個不存在的資料,每次都去資料庫查詢,如果流量大時,可能導致資料庫崩潰(惡意頻繁查詢,攻擊應用時出現)。

解決:使用布隆過濾器,將所有可能存在的資料雜湊到乙個足夠大的bitmap中,不存在的資料會被這個bitmap攔截掉,從而避免了對底層儲存系統的查詢壓力。

概念:多個key查詢並且出現高併發,快取中失效或者查不到,然後都去資料庫查詢,導致資料庫崩潰。

原因

:key同時失效、redis本身崩潰

解決:在快取資料的過期時間上再加乙個隨機值,減少快取在同一時間過期;在快取失效後,通過加鎖或者佇列來控制查詢資料庫執行緒的數量。

合格網管必備知識之十問十答

今天,隨著計算機的廣泛應用和網路的流行,越來越多的單位和部門開始引入計算機網路管理,從而相應的需要更多的優秀網管。已有幾年 腦齡 的你是不是也有成為網管的雄心壯志?在你成為一名合格的網管前,你必須先把下面的十個問題弄清楚。如果連這些最基本的網管知識你都不具備的話,那你怎麼能不補這堂課呢?計算機網路是...

網管必備之十問十答

已有幾年 腦齡 的你是不是也有成為網管的雄心壯志?在你成為一名合格的網管前,你必須先把下面的十個問題弄清楚 今天,隨著計算機的廣泛應用和網路的流行,越來越多的單位和部門開始引入計算機網路管理,從而相應的需要更多的優秀網管。已有幾年 腦齡 的你是不是也有成為網管的雄心壯志?在你成為一名合格的網管前,你...

作業系統基礎訓練十問十答

q 簡述linux程序記憶體空間分為哪幾個段?作用分別是什麼?a linux中的 程序記憶體空間 分為 資料段 段 和 堆疊段 三段。資料段 存放的是全域性變數 常數以及動態資料分配的資料空間 段 存放的是程式 的資料 堆疊段 存放的是子程式的返回位址 子程式的引數以及程式的區域性變數等。q 如何檢...