-
1 # 有魚十五
-
2 # 此生唯一
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
-
3 # 一個存在感小透明
redis目前能夠在快取領域迅速蠶食鯨吞memcached的市場佔比,能夠在分散式架構中扮演重要的地位,都與其支援多種資料型別(而memcached只支援一種)這個優勢有關。
redis支援儲存的資料型別一共有5種,但是根據我的工作經驗,最常用的只有三種,接下來,我就介紹下最常用的三種。
Listlist是redis中常用的資料型別,能夠進行頭尾查詢,插入,移除(lpop,lpush,rpop,rpush等等);
支援像Python一樣的分片讀取(lrange api);
list還有一個更加突出的功能,它可以從當前佇列彈出一個值,然後插入到另一個佇列中(BRPOPLPUSH)。這個過程是原子的,保證了資料一致性,避免由於中間步驟失敗而導致數值丟失。
Setset其實和list類似,但是正如平時我們瞭解的set,首先它的儲存是無序的,其次它的儲存是去重的。也就是說,如果你需要記錄資料的插入順序,或者可能會插入重複資料,並且資料不可去重的話,用list就更合適些,其它場景,就可以考慮用set。
set可以進行基礎的增刪(sadd,srem),也能進行進行集合操作,比如求差集(sdiff),求交集(sinter),求並集(sunion),返回集合中全部元素,但是並不將它們彈出(smember)。同時set也支援像list一樣,用一個原子操作,把一個元素從當前set彈出,並壓入另一個set(smove)。
hashhash是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,但是由於不太常用,因此不在此介紹了。
-
4 # 會點程式碼的大叔
Redis中的所有 value 都是以 Object 的形式存在的,其通用結構如下:
typedef struct redisObject {
unsigned [type] 4;
unsigned [encoding] 4;
unsigned [lru] REDIS_LRU_BITS;
int refcount;
void *ptr;
} robj;
type:指型別,String、Hash、List、Set、ZSet;encoding:型別具體的實現方式;比如 Set 是用 hashTable 實現還是 intSet 實現;lru:最後一次被訪問的資訊,其實一看到 LRU 估計也就和淘汰策略有關;refcount:物件引用計數;ptr:指向實際實現者的地址;StringRedis 中的 String 不僅僅表示 字串,還可以表示 整型、浮點型。
String 的編碼可以是 int、raw 或者 embstr;單說普通的字串,就有 raw 和 embstr 兩種實現方式,embstr 是 Redis 3.0 新增的資料結構:
字串長度小於 39 位元組,就用 embstr 物件,否則用傳統的raw物件(Redis 3.2版本之後,這裡變成了以 44 位元組為分界)。
當然缺點也非常明顯,如果字串的長度增加,需要重新分配記憶體的時候,整個 RedisObject 和 sds 都需要重新分配空間。
修改 embstr 物件的時候,Redis 會將其轉換成 raw 格式再進行修改,所以 embstr 物件修改之後的物件,一定是 raw 的。
應用場景:常規計數都可以使用,可用作快取、計數、限速等等,比如商品剩餘數量,字典表資訊,長度不能超過 512MB。
HashHash 物件的底層實現可以是 ziplist 或者 hashtable。
ziplist:在這個資料結構中,是按照 key1, value1, key2, value2 這樣的順序存放來儲存的;
hashTable:是由 dict 這個結構來實現的。(這個結構比較複雜,後面單寫一篇來說)
應用場景:Hash 適用於儲存結構化的物件,可以直接修改這個物件中的某個欄位的值;比如使用者資訊。
ListList 物件的編碼可以是 ziplist 或者 linkedlist,從名字上也能看出來兩種結構都是啥。
ziplist:是一種壓縮連結串列,它儲存資料都是連續地放在記憶體區域當中。
linkedlist:是一種雙向連結串列。
應用場景:通常網站上的訊息列表,可以使用 List 來進行儲存;另外 lrange 命令,從某個元素開始,讀取多少個元素,可以看做是分頁查詢,比如很多網站上那種不斷下拉,不斷分頁的效果。
SetSet 相對於 List 來說,Set 是可以自動排重的;它的編碼可以是 intset 或者 hashtable 。
intset:是一個整數集合,支援三種長度的整數:int16_t、int32_t、int64_t;集合中的資料長度必須是一致的,比如一個 int16_t 長度的 Set,當插入了一條 int32_t 長度的資料,那麼所有的資料都會轉成 int32_t 長度(不支援降級)。
hashTable:對於 Set 來說,hashTable 的 value 永遠為 NULL。
應用場景:如果要儲存一個列表,同時又需要做資料排重的時候,可以使用 set ;另外,Redis 還為 Set 提供了求交集、並集、差集等操作,比如微博上面的【共同關注】這個功能,就可以用 Set 實現。
ZSet / Sorted Set和 Set 相比,ZSet 增加了一個引數 score,集合中的元素按照 score 進行有序排列。
有序集合的編碼可能兩種,一種是 ziplist,另一種是 skipList 與 hashTable 的結合。
ziplist:和 Hash 類似,元素 和 score 都是按順序存放的;比較適合用於元素內容不大的場景。
skipList + hashTable:是一種新增,移除,更新元素等操作更高效的資料結構,這個跳躍表的資料結構,我近期會發一篇文章單獨介紹。
應用場景:有序 + 排重的場景,比如經常玩遊戲的同學,應該不會陌生各種排行榜,就可以使用 ZSet 來實現。
-
5 # Yoby
有八種,五種基本型別 字串 雜湊 列表 集合 有序集合 另外三種 點陣圖 基數 geo
後三種於特殊用途,比如基數統計頁面uv就很好,geo做附近商家 什麼的很容易,點陣圖做統計比起字元型別更節省空間,每種型別都有自己優勢,list做佇列訊息就很好 有序集合用來做排序就很好
-
6 # 全棧技術棧
Redis支援5種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)
1 stringstring 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。value其實不僅是String,也可以是數字。string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB。
2 HashHash 是一個鍵值(key => value)對集合。Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。
3 listlist 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。
4 setset 是string型別的無序集合。集合是透過hashtable實現的,概念和數學中個的集合基本類似,可以交集,並集,差集等等,set中的元素是沒有順序的。所以新增,刪除,查詢的複雜度都是O(1)。
5 zsetzset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。 *zadd 命令:*新增元素到集合,元素在集合中存在則更新對應score。 常用命令:zadd,zrange,zrem,zcard等
回覆列表
Set
String
Hash
Zset
List
Stream