1. 程式人生 > 其它 >Redis-資料結構與高效能原理

Redis-資料結構與高效能原理

資料結構

字串String

常用操作

//存入字串鍵值對 SET key value //批量儲存字串鍵值對 MSET key value [key value ...] //存入一個不存在的字串鍵值對 SETNX key value //獲取一個字串鍵值 GET key //批量獲取字串鍵值 MGET key [key ...] //刪除一個鍵 DEL key [key ...] //設定一個鍵的過期時間(秒) EXPIRE key seconds 原子加減 //將key中儲存的數字值加1 INCR key //將key中儲存的數字值減1 DECR key //將key所儲存的值加上increment INCRBY key increment //將key所儲存的值減去decrement DECRBY key decrement

應用場景

  • 單值快取
SET key value GET key
  • 物件快取
SET user:1 value(json格式資料) MSET user:1:name zhuge user:1:balance 1888 MGET user:1:name user:1:balance
  • 分散式鎖
//返回1代表獲取鎖成功 SETNX product:10001 true //返回0代表獲取鎖失敗 SETNX product:10001 true //...... 執行業務操作 釋放鎖 DEL product:10001 //防止程式意外終止導致死鎖 SET product:10001 true ex 10 nx
  • 計數器
INCR article:readcount:{} GET article:readcount:{}
  • Web叢集session共享
Spring session + redis實現session共享
  • 分散式系統全域性序列號
INCRY orderId 1000

雜湊Hash

常用操作

//儲存一個雜湊表key的鍵值 HSET key field value //儲存一個不存在的雜湊表key的鍵值 GSETNX key field value //在一個雜湊表key中儲存多個鍵值對 HMSET key field value [field value ...] //獲取雜湊表key對應的field鍵值 HGET key field //批量獲取雜湊表key中多個field鍵值 HMGET key field [field ...] //刪除雜湊表key中的field鍵值 HDEL key field [field ...] //返回雜湊表key中的field的數量 HLEN key //返回雜湊表key中的所有的鍵值 HGETALL key //為雜湊表key中field鍵的值加上增量increment HINCRBY key field increment

應用場景

  • 電商購物車
    • 以使用者id為key
    • 以商品id為field
    • 商品數量為value
  • 購物車操作
    • 新增商品
hset cart:1001 1088 1
    • 增加數量
hincrby cart:1001 1088 1
    • 商品總數
hlen cart:1001
    • 刪除商品
hdel cart:1001 1088
    • 獲取購物車所有商品
hgetall cart:1001

優缺點

  • 優點
    • 同類資料歸類整合儲存,方便資料管理
    • 相比string操作消耗記憶體與cpu更小
    • 相比string儲存更節省空間
  • 缺點
    • 過期功能不能使用在field上,只能用在key上
    • Redis叢集架構下不適合大規模使用

列表List

常用操作

//將一個或多個值value插入到key列表的表頭(最左邊) LPUSH key value [value ...] //將一個或多個值value插入到key列表的表尾(最右邊) RPUSH key value [value ...] //移除並返回key列表的頭元素 LPOP key //移除並返回key列表的尾元素 RPOP key //返回列表key中指定區間內的元素,區間以偏移量start和stop指定 LRANGE key start stop //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待 BLPOP key [key ...] timeout //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一 直阻塞等待 BRPOP key [key ...] timeout

常用資料結構

  • Stack = LPUSH + LPOP = FILO
  • Queue = LPUSH + RPOP = FIFO
  • Blocking MQ = LPUSH + BRPOP

應用場景

  • 微博、微信公眾號資訊流

集合Set

常用操作

//往集合key中存入元素,元素存在則忽略,若key不存在則新建 SADD key member [member ...] //從集合key中刪除元素 SREM key member [member ...] //獲取集合key中所有元素 SMEMBERS key //獲取集合key的元素個數 SCARD key //判斷member元素是否存在與集合key中 SISMEMBER key member //從集合key中選出count個元素,元素不從key中刪除 SRANDMEMBER key [count] //從集合key中選出count個元素,元素從key中刪除 SPOP key [count]

運算操作

//交集運算 SINTER key [key ...] //將交集結果存入新集合destination中 SINTERSTORE destination key [key ...] //並集運算 SUNION key [key ...] //將並集結果存入新集合destination中 SUNIONSTORE destination key [key ...] //差集運算 SDIFF key [key ...] //將差集結果存入新集合destination中 SDIFFSTORE desination key [key ...]

應用場景

  • 點選參與抽獎加入集合
SADD key {userID}
  • 檢視參與抽獎所有使用者
SMEMBERS key
  • 抽取count名中將者
SRANDMEMEBER key [count]/SPOP key [count]
  • 微信、微博點贊、收藏、標籤

有序集合Zset

常用操作

//往有序集合key中加入帶分值元素 ZADD key score member [[score member] ...] //從有序集合key中刪除元素 ZREM key member [member ...] //返回有序集合key中元素member的分值 ZSCORE key member //為有序集合key中元素member的分值加上increment ZINCRBY key increment member //返回有序集合key中元素個數 ZCARD key //正序獲取有序集合key從start下標到stop下標的元素 ZRANGE key start stop [WITHSCORES] //倒序獲取有序集合key從start下標到stop下標的元素 ZREVRANGE key start stop [WITHSCORES]

集合操作

//並集計算 ZUNIONSTORE destkey numeys key [key ...] //交集計算 ZINTERSTORE destkey numbers key [key ...]

應用場景

  • 實現排行榜
    • 點選新聞
ZINCRBY ...
    • 當日排行前十
ZREVRANGE ...
    • 搜尋榜單
ZUNIONSTORE ...
    • 七日排行前十
ZREVRANGE ...

高效能原理

Redis是單執行緒嗎?

Redis單執行緒是指Redis的網路IO和鍵值對讀寫是由一個執行緒來完成的,這也是Redis對外提供鍵值服務的主要流程。但Redis的其他功能,比如持久化,非同步刪除、叢集資料同步等,其實是由額外的執行緒執行的。

Redis單執行緒為什麼還能這麼快?

因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算,而且單執行緒避免了多執行緒的切換效能損耗問題,正因為Redis是單執行緒,所以要小心使用Redis指令,對於那些耗時的指令,一定要謹慎使用,一不小心可能就會導致Redis卡頓。

Redis單執行緒如何處理那麼多的併發客戶端連線?

Redis的IO多路複用:redis利用epoll開實現IO多路複用,將連線資訊和事件放到佇列中,依次放到檔案事件分派器,事件分派器將事件分發給事件處理器。 。