redis 應用場景

redis簡介

REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它一般被稱爲數據結構服務器,由於值(value)能夠是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
Redis採用的是基於內存的採用的是單進程單線程模型的KV數據庫,由C語言編寫。官方提供的數據是能夠達到100000+的qps前端

單線程優勢

  • 代碼更清晰,處理邏輯更簡單
  • 不用去考慮各類鎖的問題,不存在加鎖釋放鎖操做,沒有由於可能出現死鎖而致使的性能消耗
  • 不存在多進程或者多線程致使的切換而消耗CPU
  • redis線程是安全的

單線程缺點

  • 沒法發揮多核CPU性能,不過能夠經過在單機開多個Redis實例來完善

redis應用場景

  • 令牌(Token)生成
  • 短信驗證碼
  • 排行榜
  • 消息隊列
    Redis 中list的數據結構實現是雙向鏈表,因此能夠很是便捷的應用於消息隊列(生產者 / 消費者模型)。消息的生產者只須要經過lpush將消息放入 list,消費者即可以經過rpop取出該消息,而且能夠保證消息的有序性。若是須要實現帶有優先級的消息隊列也能夠選擇sorted set。而pub/sub功能也能夠用做發佈者 / 訂閱者模型的消息。不管使用何種方式,因爲 Redis 擁有持久化功能,也不須要擔憂因爲服務器故障致使消息丟失的狀況。
    若是對於數據一致性要求高的話仍是用RocketMQ等專業系統。
    因爲redis把數據添加到隊列是返回添加元素在隊列的第幾位,因此能夠作判斷用戶是第幾個訪問這種業務
    隊列不只能夠把併發請求變成串行,而且還能夠作隊列或者棧使用
  • 分佈式鎖
    驗證前端的重複請求,能夠經過redis進行過濾
    秒殺系統,基於redis是單線程特徵,防止出現數據庫「爆破」
    全局增量ID生成,相似「秒殺」
  • 計數器
    諸如統計點擊數等應用。因爲單線程,能夠避免併發問題,保證不會出錯,並且100%毫秒級性能!
    計數功能應該是最適合 Redis 的使用場景之一了,由於它高頻率讀寫的特徵能夠徹底發揮 Redis 做爲內存數據庫的高效。在 Redis 的數據結構中,string、hash和sorted set都提供了incr方法用於原子性的自增操做。
    例子:redis

    • 若是應用須要顯示天天的註冊用戶數,即可以使用string做爲計數器,設定一個名爲REGISTERED_COUNT_TODAY的 key,並在初始化時給它設置一個到凌晨 0 點的過時時間,每當用戶註冊成功後便使用incr命令使該 key 增加 1,同時當天天凌晨 0 點後,這個計數器都會由於 key 過時使值清零。
    • 每條微博都有點贊數、評論數、轉發數和瀏覽數四條屬性,這時用hash進行計數會更好,將該計數器的 key 設爲weibo:weibo_id,hash的 field 爲like_number、comment_number、forward_number和view_number,在對應操做後經過hincrby使hash 中的 field 自增。
    • 若是應用有一個發帖排行榜的功能,便選擇sorted set吧,將集合的 key 設爲POST_RANK。當用戶發帖後,使用zincrby將該用戶 id 的 score 增加 1。sorted set會從新進行排序,用戶所在排行榜的位置也就會獲得實時的更新。
  • 緩存

參考:
1) https://www.scienjus.com/redi...
2) https://segmentfault.com/a/11...數據庫