Redis數據類型

String

  • string是Redis最基本的數據類型,一個key對應一個string。
  • string 類型是二進位安全的。意思是 redis 的 string 任意格式的二進位數據。比如jpg圖片或者序列化的對象。
  • string 類型的值最大能存儲 512M

相關常用命令

Set KEY VALUE //設置給定key的值,如果key不存在則添加,如果存在則更新值
SETEX key Seconds VALUE //為指定的 key 設置值及其過期時間。如果 key 已經存在, SETEX命令將會替換舊的值。
Get KEY //獲取指定 key 的值
GETRANGE KEY start end //獲取存儲在指定 key 中字元串的子字元串。字元串的截取範圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在內)。
GETSET KEY VALUE //設置給定key的值,並返回舊值
SETNX KEY VALUE //給定key不存在時,為key設定值
MSET key1 value1 key2 value2 .. keyN valueN //同時設定多個值
INCR KEY //給定key的值+1 key對應的值不是整型會報錯,value is not an integer or out of range
DECR KEY //給定key的值-1 key對應的值不是整型會報錯,value is not an integer or out of range

1585826324110

應用場景

  • string類型是我們最常用的類型,不管是字元串,數字或者是序列化對象的快取都可以用到。
  • 可以利用redis的INCR、DECR等指令來實現原子計數的效果,用來實現業務上的統計計數需求。
  • 分散式sessionkey系統。 redis可以很方便的設置sessionkey的自動過期時間,分散式系統的各個node可以統一的進行session的管理。
  • 分散式鎖。使用SETNX命令當不存在才添加,可以很好的來實現分散式鎖。
  • 其實可以看出來,我們用redis很大部分都是基於redis的高性能和單執行緒&原子性操作,可以把我們應用程式中多執行緒的複雜性和分散式環境中並發的複雜性給消除了。

Hash

Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。通過命名很清楚的之後Hash這種數據類型時使用了哈希表作為底層實現,關於什麼是哈希,什麼是哈希表可以自行百度,後續有時間可以單獨開一篇來詳細分析Redis hash的實現。

相關常用命令

Hset key field value //設置給定key 的field的value
Hmset Key field1 value1 field2 value 2 //同時設置多個 field value
Hget key field //獲取key中指定feild的value值
Hmget key feild1 feild2 //獲取多個feild的值

1586938411424

應用場景

在前面說明string類型的時候有說到可以用string類型來操作序列化的對象,但是我們在對於對象的任何修改的時候都需要把字元串取出來然後反序列化,再進行修改,再序列化,最後存入到redis中,這樣的消耗太大了,而利用hash這種數據結構就很方便的實現對象的部分欄位修改。


List

Redis List是簡單的字元串列表,數據結構是雙向鏈表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊),也就是兼有棧和隊列的特性。因為是鏈表,所以查找的複雜度就是O(n)了,但是考慮到常用的指令都是在列頭和列尾操作,所以這種數據結構才是最適合的。

相關常用命令

Lpush key value1 value2  //將一個或多個值插入List的頭部
Rpush key value1 value2  //將一個或多個值插入List的尾部
Lpop key  //移除列表頭的元素
Rpop key  //移除列表尾元素
BLpop key timeut//移除列表頭的元素,如果沒有元素會阻塞直到發現可彈出元素或者超時
LREM key count value  //根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素。 count> 0 從列表頭向尾檢索移除count個與value相等的元素並移除;count < 0 從尾向頭檢索移除count個與value相等的元素並移除;count = 0,移除所有與value相等的元素

應用場景

  • 各種列表的存儲

  • 消息隊列,可以利用BLpop相關的指令來實現消息隊列,但是沒有ack機制,需要其他方式來彌補。可以使用sorted set 來存儲執行的結果,當消費消息的時候,給sorted set 添加一條數據並用時間作為score,當任務完成從sorted set中移除,定時根據score檢查超時任務並重新放入list中。另一種做法就是利用list中BRPpopLpush當彈出一個值的時候,將該值添加到另一個列表,完成時利用LREM命令消除掉,這種方式不太好的地方就是不太方便進行超時任務的處理。 但是,對於消息隊列,我們已經有RabbitMQ,Kafka之類成熟且機制完善的消息隊列了,建議使用的時候就不用考慮用Redis來做了。當然redis支援fabu/訂閱的模式(後面會詳細介紹),也是Redis能作為消息隊列的原因。

  • 利用LRange實現列表的分頁,但是需要注意的是LRange需要的參數start 和end,是右閉合的,也就是包含end下標所代表的項

Set

Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的數據。

Redis 中集合是通過哈希表實現的,其實就是一個值為null的hashmap,所以添加,刪除,查找的複雜度都是 O(1),也可以通過計算hash來排重和判斷一個數據是否在集合中。

相關常用命令

SADD KEY member1 member2 //向集合中添加一個或多個成員
SPOP KEY //移除並返回集合中的一個隨機元素
SRem KEY member1 member2 //移除集合中一個或多個成員
SInter key1 key2   //返回給定集合的交集 
SUnion key1 key2 //返回給定集合的並集
SDiff key1 key2 //返回給定集合的差集
Smembers Key //返回集合中所有member
Sismember Key member //判斷member是否在集合中

應用場景

  • 需要去重情景下的列表,也可以利用命令Sismember 判斷member是否在集合中。
  • 需要對多個集合進行交集,差集,並集操作的時候,比如可以求出共同關注,共同喜愛之類的功能。

Sorted Set

Redis sorted set和Set一樣也是string類型元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

有序集合的成員是唯一的,但分數(score)卻可以重複。

Redis sorted set 內部使用了ziplist和SkipList兩種實現,當同時滿足元素數量小於128個和所有member的長度都小於64個位元組的時候會採用ziplist,如果不滿足則採用SkipList的編碼方式。當然可以通過Redis配置zset-max-ziplist-entries 和 zset-max-ziplist-value來修改這兩個條件。

1587967754637關於ziplist和skiplist的介紹太多了,感興趣的可以自行百度一下。

相關常用命令

ZAdd Key score1 member1 score2 member2 //向一個集合添加成員,如果成員存在就更新分數
ZCount Key min max //獲取指定分數區號的成員數量,包括min和max
ZRANGE Key start stop [WITHSCORES]//獲取指定下標範圍的有序成員列表 按照分數排序
ZREVRANGE Key start stop [WITHSCORES]//獲取指定下標範圍的有序成員列表 按照分數倒序

1587968676857

1587968924064

應用場景

  • 有序不重複的列表,比如基於時間的一些事件列表。
  • 可以將權重作為score來進行存儲,按照權重來進行排序或者優先操作。
  • 排行榜
Tags: