細說Redis(一)之 Redis的數據結構與應用場景
這一篇文章主要介紹Redis的數據結構與應用場景
NOSQL之Redis
Redis是一款由key-value存儲的軟件。說起NOSQL,有文檔型、鍵值型、列型存儲、圖形數據庫。其中,在簡單的讀寫性能來說,鍵值型是最快的。
Redis作為目前市面上使用最多的鍵值型數據存儲軟件,內置了多種類型的數據結構,並且提供了高可用解決方案,使用方便快捷。市面上有很多語言的庫可以調用Redis服務器。
Redis的數據結構類型
Redis有很多種數據結構,包括string、hash、list、set、sortset、hyperloglog、GEO。這些數據結構都可以設置鍵值的存在時間。
string介紹
string是以一種純字符串作為value的形式存在的。也是這幾種之中使用最多的數據結構。value可以存儲json格式、數值型等。
string使用場景
string使用場景一般是存儲簡單的鍵值類型。比如用戶信息,登錄信息,配置信息等。還有一種用得比較多的是string的incr/decr操作,即自減/自增操作。調用它是原子性的,無論調用多少次,都一一計算成功。例如需要增減庫存的操作。
盡管string的value可以存儲很大,甚至500多MB的容量。但是在性能上來說,我們盡量存儲value的值不要過1MB。
hash介紹
hash是一個集合,使用過hash的人都知道,hash的讀取性能都一樣快。在redis中,hash因為是一個集合,所以有兩層。第一層是key:hash集合value,第二層是hashkey:string value。所以判斷是否采用hash的時候可以參照有兩層key的設計來做參考。並且註意的是,設置過期時間只能在第一層的key上面設置。
hash使用場景
使用hash,一般是有那種需要兩層key的應用場景,也可以是‘刪除一個key可以刪除所有內容’的場景。例如一個商品有很多規格,規格裏面有不同的值。
上面的例子表示成下面的圖:
如果需要刪除商品時,可以一次性刪除‘商品id’的key,則商品裏面的所有規格也會刪除,而不需要找到對應的規格再做處理。如果查找商品id與規格id1的商品時,則通過兩個key查找即可。或者查找所有商品的規格,查找商品id即可。
需要註意的是,經過測試,在性能上來說一般hash裏面的第二層key,不要超過200個為佳。盡管hash裏面的key-value能達到500多MB的存儲容量。
list介紹
list是一個集合,而在redis中,list的使用場景多種多樣。在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一樣插入兩層的key。list是一種有序的、可重復的集合。
list使用場景
list可以使用左推、左拉、右推、右拉的方式。所以你可以使用list作為集合存儲,比如存儲某寶商鋪裏面的所有商品。
也可以用作輕量級別的隊列來使用。左推左拉、右推右拉。
需要註意的是盡管redis可以使用推拉的隊列模式,但是一定要註意場景。因為redis的隊列是一種輕量級別的,沒有隊列重試、隊列重放機制。消費完隊列消息在redis代表已經刪除了。
消息隊列之發布訂閱模式
redis除了list的推拉隊列模式之外,還有一種是發布訂閱的模式。發布訂閱模式有是publish/subscribe的命令。與推拉隊列模式不同之處在於,訂閱者可以訂閱多個頻道,發布者可以向指定的頻道或者所有頻道發送消息。
之所以在上面的list中結束這種隊列模式,主要為了對比這兩種的區別。
set介紹
set是一種無序的,不能重復的集合。並且在redis中,只有一個key。
set使用場景
如保存一些標簽的名字。標簽的名字不可以重復,順序是可以無序的。
如下面:
需要註意的是使用set一定不要存儲大量的數據。value的值不宜過大,並且集合數量不宜過大。幾百個集合的值,value不超過1MB為佳。
sortset介紹
sortset在redis中是有序的,並且不能重復。既有list的有序,又有set的不可重復性。
sortset使用場景
sortset的使用場景一般是排行榜之類的場景。
sortset需要註意的地方與上面的set一致。
hyperloglog介紹
hyperloglog,使用得不多。hyperloglog從創建一開始存儲12KB的容量。
hyperloglog使用場景
一般用於統計使用,例如統計頁面PV/UV等數據。
GEO介紹
GEO,使用得也不多。用於處理地理位置的信息。
GEO使用場景
在redis中,GEO可以保存地理位置的信息,並且可以計算地理位置的距離等。場景就在於使用地理位置時,並且需要計算,快速的場景,可使用。
可以關註本人的公眾號,多年經驗的原創文章共享給大家。
細說Redis(一)之 Redis的數據結構與應用場景