redis階段one

redis簡介

  • redis:高性能鍵值對nosql數據庫,以單線程方式處理請求(原子性操作),基於內存存取數據。解決海量用戶,高併發情況下數據處理問題。
  • 問題描述:關係型數據庫在海量數據,高併發下數據處理的問題
    • 1、性能瓶頸:磁盤IO性能低下。
    • 2、擴展瓶頸:關係型數據庫數據之間關係複雜,擴展性差,不便於大規模集羣。
  • 解決方案:
    • 1、內存IO
    • 2、去掉數據鍵的複雜性
  • redis特性
    • 1、數據間無聯繫
    • 2、高性能、單線程(操作都是原子性,不必考慮併發帶來的問題)
    • 3、多數據類型支持
      • string
      • list
      • hash
      • set
      • sorted_set
    • 4、數據持久化RDB/AOF,防止數據災難
      • RDB:數據快照,當前數據保存到文件中。(默認)
      • AOF:記錄所有寫命令到文件,再次開啓數據庫時執行一遍寫命令。
  • redis應用
    • 爲熱點數據加速查詢(主要場景),如熱點商品、熱點新聞、熱點資訊、推廣類等高訪問量信息等
    • 任務隊列,如秒殺、搶購、購票排隊等
    • 即時信息查詢,如各位排行榜、各類網站訪問統計、公交到站信息、在線人數信息(聊天室、網站)、設
      備信號等
    • 時效性信息控制,如驗證碼控制、投票控制等
    • 分佈式數據共享,如分佈式集羣架構中的 session 分離
    • 消息隊列
    • 分佈式鎖
  • 命令
    • 幫助命令
      • 單個命令help command
      • 組命令help @string(組有string,list,hash…等)
    • 清屏命令 clear
    • 存取命令說明
      • 存相關命令:不存在原信息,則創建, 存在則替換
      • 取相關命令:不存在原信息,則返回nil
    • set 和mset 使用場景
      • 當數據量夠大時,由於redis採用單線程處理,三個單獨的set,效率不如一次mset三個數據,但是一次mset的數據也不能太大,否則單線程就阻塞在這裏了,當數據量過大,可拆分成合適大小處理。

使用案例

  • 數據庫表id生成 incr
    • redis所有操作都是原子性,incr自增操作生成數據庫id
    • 支持分表
    • 支持數據庫集羣
  • 投票(每4小時只能投一票) setex(秒) psetex(毫秒)
    • 控制基於時效性的業務對象
    • 投完票記錄下投票者的id,存入redis中,設置過期時間爲4小時,再次投票時判斷redis中是否存在,存在(沒過期)即不能再次投票。
  • redis用於各種高熱度結構性和非結構性數據
    • 場景:明星的微博主頁和我們的微博主頁相比,他們的就是高熱度的。此時他們主頁的相關數據應存放的redis裏,以便快速響應高併發的訪問。
    • 數據結構如下:
      • user:id:fans
      • user:id:focus
    • 我們可以如上在redis中分開存放,也可以使用json同時存放,那種效果好視具體情況而定
      • user:id:{fans:100,focus:10}
    • redis中的數據大部分還是來自數據庫,因此常用如下命名規則
      • 表名:主鍵名:主鍵值:字段名
      • user :id :100 :name
  • hash結構適用於搶購,限購,限量優惠券,激活碼等業務的數據存儲。
  • list應用場景
    • 微博,微信點贊等,需要按照順序顯示關注的人,點讚的人,需要按照先後順序呈現的數據 ,特別關注,最新發博,分組等。
  • set應用場景
    • 隨機推薦類信息檢索,例如熱點歌單,熱點新聞推薦,熱點旅遊線路,APP推薦,大V推薦。
    • 使用set 的交集,並集,差集等處理共同好友顯示,推薦好友,共同關注的公衆號等數據的處理
    • 數據不可重複,交叉數據類型處理
    • 同類型數據去重,統計訪問網站的不同用戶,IP
      • 網站流量監控方面
        • 1、PV:查看了頁面就+1 ----string incr
        • 2、UV:不同用戶訪問,只有不同用戶才+1,set
        • 3、IP:不同IP才+1,set
    • 黑白名單
  • sorted_set應用場景
    • 在set基礎上主要應用點:需要排序/權重/優先級(優先級可由多個級別共同組成)
    • 排行榜,投票,有優先級的任務。

各類型注意事項

  • string類型注意事項
    • 數據操作成功與否和數據操作正常返回之間的差異
      • (integer)0:false
      • (integer)1:true
      • 如上是操作失敗和成功,strlen命令返回1的話代表正常返回,所以0,1代表成功還是失敗還要參照具體執行的命令。
    • 未獲取到數據返回nil
    • string 類型數據最大存儲量521M
    • string類型數字範圍(正負)java.lang.Long.MAX_VALUE
  • hash類型注意事項
    • 使用json還是hash結構存儲值
      • 上面提到user:id裏的幾個屬性可以分開存,也可以放在一個json字符串裏存,當然也可以放在一個hash結構裏,只不過在於業務的需求,選擇一種合適的方式即可。json存放,如果要修改其中某一個數據有點麻煩,如果數據不需要實時刷新,我們可以定時刷新裏面數據即可。hash存放,可以實時修改裏面某個屬性的值。
    • hash結構中屬性的多少時的結構差異
      • 存儲少量屬性:使用類數組結構
      • 存儲大量屬性:使用hashmap結構
    • hash類型的value只能存儲字符串,不允許存儲其它數據類型,不存在嵌套現象。
    • hash中最多隻能存儲2的32次方-1個鍵值對
    • hash類型十分貼近對象的存儲結構,可方便對屬性進行增加和刪除,但它並非爲對象而生,不能濫用。
    • hgetall獲取所有屬性,入股屬性過多會導致效率低下,慎用。
  • list數據類型
    • 存儲結構:底層使用雙向鏈表結構,正因爲是雙向列表,所以既可以從左進左出,右進右出,故有如下命令
      • lpush
      • rpush
      • lpop
      • rpop
      • 獲取數據(0代表第一個,-1代表倒數第一個,-2代表倒數第二個)
        • lrange
        • lindex
        • llen
      • list擴展:指定時間內獲取並移除數據
        • blpop key1 [key2] timeout
        • brpop key1 [key2] timeout
        • brpoplpush source destination timeout
        • b表示block,阻塞,阻塞期間如果list中有數據或者新存入了數據,就讀取並刪除。
      • lrem key count value
        • 左邊刪除count個value(list是允許value重複的,故有count表示個數值)
    • list類型注意事項(應用於操作先後順序的的業務數據)
      • value只能是string,最多隻能存儲2的32次方-1個值
      • list實現底層是雙向鏈表(讀取速度稍慢),可左右進出,操作方式可以是隊列或者棧(左進左出---->先進先出)
      • -1表示倒數第一個值
      • 分頁,第一個在redis中,後續再數據庫中查詢(第一頁看的比較多,後面頁看的較少的時候)
  • set類型
    • 命令
      • sadd key member [member…]
      • smembers key
      • srem key member1 [member2…]
      • scard key 獲取集合數據總量
      • sismember key member 判斷集合中是否包含指定數據
    • 隨機取/隨機取並移除
      • srandmember key count 隨機取
      • spop key count 隨機取並移除
  • sorted_set類型(set的基礎上添加了排序,存儲時指定score的值進行排序,注意score並不是指,只用於排序而已)
    • 存儲、取、刪除、升序顯示(默認)、降序顯示(zrevrange)、是否顯示score(withscores)
    • sorted_set中score值的獲取和修改
      • zscore key member
      • zincrby key increment member 可應用於投票和排序

redis適用場景

  • 創建數據庫表id,支持分表以及數據庫集羣
    • 把string類型的數字當做整型處理,incr自增得表id
  • 控制熱點事物的時效性,通過數據是否失效控制業務行爲
    • 熱點新聞多久失效,SETEX
    • 微信投票時效性,SETEX
    • 微信投票,規定每四個小時只能,記錄投票用戶id,設置過期時間爲四小時。
  • 高頻,熱點信息
    • 新浪微博明星主頁
    • 頭條熱點新聞
    • 百度頭條新聞,熱點新聞排行榜
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章