redis憑藉著十分多的優良特性稱霸緩存界,而豐富的數據類型就是至關重要的一點,能滿足更多的場景需要!

redis包括的數據類型如下:

1,字元串string:區別於JAVA中的字元串,string類型並不只是能存儲JAVA中的字元串,還有int,json等,redis中的string被定義為二進位安全的,也就代表著能存儲文件的二進位串!

2,散列/哈希hash:維護著一個超大的字典,可以輕鬆的拿出某個屬性來進行更改,而不需要額外的序列化等操作,類似資料庫中的根據欄位update數據!

3,列表list:使用雙端鏈表順序性的存儲數據,可用來實現消息隊列!

4,集合set:存放不重複的存放數據,類似於JAVA中的set,可以用來做去重操作!

5,排序集合sorted set:存放排序的不重複數據!

相比memcache等傳統緩存,支持很多數據類型的是redis更具有可選擇性,能支持完成一些常規的數據處理,而且redis還能支持數據持久化,事務等!所以redis是很好的選擇!

不過內存型緩存作為資料庫的防護層,會有緩存擊穿,緩存穿透,雪崩問題,可參見https://www.wukong.com/answer/6668978631676526860/?app=wenda


redis目前能夠在緩存領域迅速蠶食鯨吞memcached的市場佔比,能夠在分散式架構中扮演重要的地位,都與其支持多種數據類型(而memcached只支持一種)這個優勢有關。

redis支持存儲的數據類型一共有5種,但是根據我的工作經驗,最常用的只有三種,接下來,我就介紹下最常用的三種。

List

list是redis中常用的數據類型,能夠進行頭尾查找,插入,移除(lpop,lpush,rpop,rpush等等);

支持像Python一樣的分片讀取(lrange api);

可以按照索引查找隊列中元素(lindex),刪除隊列中元素(lrem),修改隊列中元素(lset),還能獲取隊列長度(llen)。

list還有一個更加突出的功能,它可以從當前隊列彈出一個值,然後插入到另一個隊列中(BRPOPLPUSH)。這個過程是原子的,保證了數據一致性,避免由於中間步驟失敗而導致數值丟失。

Set

set其實和list類似,但是正如平時我們了解的set,首先它的存儲是無序的,其次它的存儲是去重的。也就是說,如果你需要記錄數據的插入順序,或者可能會插入重複數據,並且數據不可去重的話,用list就更合適些,其它場景,就可以考慮用set。

set可以進行基礎的增刪(sadd,srem),也能進行進行集合操作,比如求差集(sdiff),求交集(sinter),求並集(sunion),返回集合中全部元素,但是並不將它們彈出(smember)。同時set也支持像list一樣,用一個原子操作,把一個元素從當前set彈出,並壓入另一個set(smove)。

hash

hash是redis中最常用的一種數據結構,其實就是我們常說的map。

它是一個string型的key-value,因此特別適用於存儲序列化對象。理論上,每個 hash 可以存儲 40多億個鍵值對。

hash的操作api要比set和list多了不少。

基礎的有hset,hget,hdel,hexist(檢查元素是否存在),hincrby(這個是為指定的整數欄位加指定數值,相當於能夠原子性的做到查找和修改,減少了我們自己去實現的麻煩)。

hash還有hgetAll,hgetKeys這種介面,能夠批量的把hash中指定欄位的全部內容都拉取回來。但是要慎用,我曾親身經歷過,在server高並發情況下,會導致server出現OOM。

除了上面介紹的常用的三種,redis還支持String和sorted set,但是由於不太常用,因此不在此介紹了。

以上是我的淺見,歡迎各位在下方評論區交流點贊。

我是蘇蘇思量,來自BAT的Java開發工程師,每日分享科技類見聞,歡迎關注我,與我共同進步。


Set

String

Hash

Zset

List

Stream


推薦閱讀:
相关文章