Redis 在項目中合理使用經驗總結

背景

  • Redis 是一個開源的內存數據結構存儲系統。
  • 能夠做爲數據庫、緩存和消息中間件使用。
  • 支持多種類型的數據結構。
  • Redis 內置了 複製(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不一樣級別的 磁盤持久化(persistence)。
  • 經過 Redis 哨兵(Sentinel)和 Redis 集羣(Cluster)的自動分區,提供高可用性(high availability)。

基本數據類型

  • 字符串(strings)

一、string 的過時時間在從新設置值以後會被清除redis

127.0.0.1:6379> set hello 3
OK
127.0.0.1:6379> get hello
"3"
127.0.0.1:6379> ttl hello
(integer) -1
127.0.0.1:6379> expire hello 3000
(integer) 1
127.0.0.1:6379> set hello 4
OK
127.0.0.1:6379> ttl hello
(integer) -1

二、設置 string 類型的值能夠覆蓋任何其餘類型spring

127.0.0.1:6379> sadd settest 1,2
(integer) 1
127.0.0.1:6379> type settest
set
127.0.0.1:6379> set settest hello
OK
127.0.0.1:6379> type settest
string
127.0.0.1:6379> sadd settest a,b
(error) WRONGTYPE Operation against a key holding the wrong kind of value
  • 散列(hashes)
  • 列表(lists)

Redis lists 基於 Linked Lists 實現。頭尾操做極速,檢索較慢數據庫

  • 集合(sets)
  • 支持範圍查找的有序集合(sorted sets)

有序集合的排序默認按照字典序排列緩存

  • bitmaps
  • hyperloglogs
  • 支持按半徑索引查詢的地理空間(geospatial)

應用場景

string

  • 緩存數據

無論是簡單和複雜的數據均可以直接轉爲string存儲。數據結構

key: active:spring2019:title value:"2019春節活動" 操做:set併發

商品信息,省市區信息,活動配置等一系列不常變化的冷數據緩存分佈式

很是熱門數據的緩存,遊戲排行,後臺每秒更新一次數據性能

  • 簡單計數

2019春節活動參加人數lua

key: active:spring2019:total value:3045 操做:incrspa

  • 定時過時

一我的一天只能進行一次簽到

key:active:checkin:userId:10000:day:20190101 value:簽到時間戳 操做:expire

  • 分佈式鎖

下面的代碼不嚴謹,nx 能夠放併發

127.0.0.1:6379> set lockkey 1  nx
OK
127.0.0.1:6379> set lockkey 1  nx
(nil)

list

  • 用戶排隊

push,pop

  • 有序消息

push,pop

  • 實現生產者和消費者模型

阻塞式訪問 BRPOP 和 BLPOP 命令

set

  • 去重列表

2019春節活動參加人數

key: active:spring2019:users value:100010,10020 操做:不少

  • 標籤

用戶標籤

商家標籤

春節活動一共有 abcde 5個任務,用戶A已經完成a,b,用戶B已經完成 c,d

  • 交集

用戶A,用戶B 都完成的任務

  • 並集

用戶A,用戶B 任一完成的任務

  • 差集

用戶A尚未完成的任務

  • 獲取隨機元素

從禮品庫 set 中隨機得到一個禮品

hash

  • 同一資源的不一樣屬性

用戶在活動期間一共得到了不一樣種類獎品數量

key:active:spring:g'ifts:user:10010 value:{"giftA":2,"giftB":5} 操做:不少

能夠直接對 giftA 執行 incr 操做

zset

  • 排行榜

用戶消費排行,點贊排行等

key:active:spring:star:rank value:用戶ID,score:點贊數量 操做:不少

根據分數獲取 top 10

查詢某個用戶的分數

查詢 得分在90-100 之間的用戶

有時候咱們的得分並非由某一項業務值決定的,多是由兩項業務值來排序的,好比先看用戶的實際得分,在看用戶等級,那麼咱們在設計score的時候能夠用小數點以前的值表示得分,小數點以後的值表示等級,若是有其餘特殊要求,還能夠考慮得分加上某個極大值來處理。

注意事項

  • 每一個 key 都應該有合理的失效時間
  • string的過時時間在從新設值後會被覆蓋
  • string類型的 set 操做能夠覆蓋類型
  • 合理使用相應的數據結構

不要用list存大量數據並檢索

  • 合理規劃 key 的數量

判斷用戶有沒有參加應該用set,不該該每一個用戶一個key

  • 環境數據隔離
  • 業務數據隔離 用戶 redis 業務 redis 活動 redis 應該作區分,活動的 redis 在活動結束後能夠自由清理
  • 合理使用管道,lua 腳本和 redis 事務,提升性能,尤爲是在腳本中使用 redis 的時候
  • 在有大量 key 的 Reids 線上系統,要在主庫禁用 keys * 操做,防止卡死
相關文章
相關標籤/搜索