redis學與思系列(2)

zxhy發表於2019-04-28

前言

上篇文章簡單的介紹了redis的使用場景和優缺點,本文接著解答以下幾個問題:

  • Redis有哪些資料結構?
  • 使用過Redis分散式鎖麼,它是什麼回事?
  • Redis 的資料型別,以及每種資料型別的使用場景?
  • 使用過Redis做非同步佇列麼,你是怎麼用的?

這些問題實際上歸結起來都和redis 提供的資料結構有關,接下來重點帶著這些問題重點解讀redis的資料結構和使用場景。(·我覺得技術本身不能創造價值,只有找到對應的適用場景,解決業務中的問題,才能產生價值)。

` redis 是基於key-value的資料庫,所有的key都是字串型別,針對value值的不同,又劃分為字串,列表,集合,有序集合,雜湊表,(點陣圖,hyperLoglog,GEO) 等等`。
複製程式碼

本文主要介紹字串有代表性的一些命令以及對應的適用場景。

命令: SET key value [EX seconds] [PX milliseconds] [NX|XX] :

  將字串值 value 關聯到 key,如果 key 已經持有其他值, SET 就覆寫舊值,無視型別,對於某個原本帶有生存時(TTL)的鍵來說, 當 SET 命令成功在這個鍵上執行時, 這個鍵原有的 TTL 將被清除.
  
  引數介紹:
  EX second :設定鍵的過期時間為 second 秒。 
  PX millisecond :設定鍵的過期時間為 millisecond 毫秒
  NX :只在鍵不存在時,才對鍵進行設定操作。 
  XX :只在鍵已經存在時,才對鍵進行設定操作。
複製程式碼

常見使用場景

  • 快取:可以將要快取的資料序列化成json串,儲存在key對應的value裡,同時可以為其指定過期時間;

  • 分散式鎖: 分散式鎖設計時要考慮以下問題:

       互斥性
       可重入性
       死鎖
       鎖的效能
    複製程式碼

採用redis實現分散式鎖,網上很多同學都給了實現方案,此處就不囉嗦了。redis 實現分散式鎖的優點是加鎖釋放鎖很快。不過採用redis 實現分散式鎖是有一些缺陷的,比如因為依賴鍵的過期機制,會導致如果加鎖時正常的業務程式碼執行時間超出了鍵的過期時間,業務程式碼還沒有執行完時,鎖已經釋放掉了,這樣其他執行緒就有可能獲取鎖,進而導致多個執行緒同時獲得鎖,不能嚴格意義上保證鎖的排他性。所以在業務選擇時要考慮到這些方面。

命令: INCR key

將 key 中儲存的數字值增一。

如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 INCR 操作。

如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤`
複製程式碼

常見使用場景:

  • 計數器: 比如用來統計頁面的uv(使用者訪問量)
  • 簡單的限速器:結合計數功能+過期機制,統計單位時間的訪問量來實現限流。

命令: SETBIT key offset value

 對 key 所儲存的字串值,設定或清除指定偏移量上的位(bit)。

 位的設定或清除取決於 value 引數,可以是 0 也可以是 1 。

 當 key 不存在時,自動生成一個新的字串值。

 字串會進行伸展(grown)以確保它可以將 value 儲存在指定的偏移量上。當字串值進行伸展時,空白位置以 0 填充。

 offset 引數必須大於或等於 0 ,小於 2^32 (bit 對映被限制在 512 MB 之內)。
複製程式碼

適用場景:

統計和查詢: 結合bitcount指令,比如從10億個無序的整數(範圍在0-40億)統計出前10個數,這種場景下使用bitmap 儲存時會極大的縮小佔用記憶體空間.

總結

本文僅僅是簡單的介紹了一下redis 字串型別的部分操作命令以及其相應的使用場景,關於redis的其他資料型別以及相應的使用場景,再後續的文章中進一步進行介紹。

相關文章