redis學與思系列(2)

前言

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

  • Redis有哪些數據結構?
  • 使用過Redis分佈式鎖麼,它是什麼回事?
  • Redis 的數據類型,以及每種數據類型的使用場景?
  • 使用過Redis作異步隊列麼,你是怎麼用的?

這些問題實際上歸結起來都和redis 提供的數據結構有關,接下來重點帶着這些問題重點解讀redis的數據結構和使用場景。(·我以爲技術自己不能創造價值,只有找到對應的適用場景,解決業務中的問題,才能產生價值)。數據庫

` redis 是基於key-value的數據庫,全部的key都是字符串類型,針對value值的不一樣,又劃分爲字符串,列表,集合,有序集合,散列表,(位圖,hyperLoglog,GEO) 等等`。
複製代碼

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

命令: 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 存儲時會極大的縮小佔用內存空間.spa

總結

本文僅僅是簡單的介紹了一下redis 字符串類型的部分操做命令以及其相應的使用場景,關於redis的其餘數據類型以及相應的使用場景,再後續的文章中進一步進行介紹。線程

相關文章
相關標籤/搜索