天天看點

Redis之常見資料結構、持久化以及并發業務場景的了解

簡述Redis資料結構

Redis總共有五種常見資料結構,三種特殊資料結構(這裡不解釋)

常用資料結構:

    STRING:

    它是由整數值和SDS(簡單動态字元串)實作的對象

    應用場景:

        1.可以用作緩存

        2.可以用作計數器

        3.可以用作共享使用者session

     HASH:它是由壓縮清單和字典實作的哈希對象

     應用場景:

        1.可以用作關系型資料庫存儲,用于存儲使用者相關資訊

     LIST:它是由壓縮清單和雙端連結清單來實作的清單對象

     應用場景:

         1.可以用作消息隊列,實作阻塞隊列,通過指令左進右出

         2.可以用作資料分頁,比如部落格上使用者的文章清單

     SET:它是由整數集合和字典來實作的集合對象

     應用場景:

          1.标簽

          2.共同好友

          3.獨立ip

     ZSET:它是由壓縮清單、字典、跳躍表來實作的有序集合對象

     應用場景:

         1.排行榜,可以按照某一字段進行排序

         2.計算權重,設定權重值,讓線程按照權重規則進行執行

簡述Redis的持久化機制RDB和AOF

兩者都是redis的持久化機制

RDB是快照級别的持久化,通過save指令和bgsave指令以二進制流檔案的形式進行持久化。執行save指令時Redis伺服器程序會發生阻塞,在RDB檔案生成完畢之前,Redis伺服器是不能執行其他指令請求操作的,而執行bgsave指令時,Redis伺服器則會Fork一個子程序來執行RDB檔案的生成工作,就相當于背景運作一般,此時Redis伺服器是非阻塞狀态的,它可以執行其他指令請求的操作,需要注意的時Redis中是不允許主程序和子程序同時執行save或bgsave指令的,為了防止主程序和子程序産生競争關系。

AOF是日志級别的持久化,它将操作資料庫的指令追加到aof檔案的末尾,如果發生當機,則會通過加載aof檔案中的指令并重新執行來達到資料庫狀态恢複的目的,它提供了三種間隔存儲方式,一種是一次指令的操作寫入一次,第二種是每隔一秒寫入一次,第三種是将寫入間隔處理交給系統管理,AOF中預設用的是每隔一秒寫入一次。

redis的配置檔案中預設開啟RDB,關閉AOF,在Redis的配置檔案中預設的save指令執行的方式有三種

                save     900      1---------------900S内,對資料庫至少進行了1次修改

                save     300     10--------------300S内,對資料庫至少進行了10次修改

                save      60    10000------------60S内,對資料庫至少進行了10000次修改

Redis高并發中可能産生的業務場景之擊穿、穿透、雪崩以及解決方案

擊穿:

如果某一熱點key(比如微網誌熱搜)每秒内有10000次請求,通路非常頻繁,處于高并發的狀态,假設這個key的有效是時間突然失效,那麼這一瞬間,每秒10000次的請求就會直接打在資料庫上,很顯然資料庫是承受不了這樣的高頻通路的,這樣就會将資料庫打死

解決:

将熱點資料設定成永久不過期,或者實作互斥鎖,加鎖——>等待緩存機器将第一次通路的資料進行緩存——>釋放鎖,如此之後的同資料高并發通路就可以直接去緩存中取出資料進行傳回。

穿透:

假設每一秒内有10000個請求,其中有8000個請求是由攻擊者發來的,在緩存和資料庫中都找不到這樣的id(可以假設此id為負數),在這種情況下也會将資料庫打死

解決:

隻要将第一次在緩存和資料庫中都找不到的key,設定對應的value為null并寫入緩存中,如此,即使之後還有7999個請求,也能将null直接傳回,而不是每次都需要來資料庫中進行查找

雪崩:

如果每一秒内有10000個請求,而緩存機器每秒最大可以扛住8000個請求,這樣顯然是不會出現問題,但是如果緩存機器突然當機,那麼這8000個請求就會直接追加,打在資料庫上,資料庫必然扛不住,理論上它會先報警,然後挂掉,實際中直接挂掉可能性會比較大

解決:

事前:redis 高可用,讀寫分離、主從複制+哨兵模式,redis cluster,避免全盤崩潰。

事中:本地 ehcache 緩存 + hystrix 限流&降級,避免 MySQL 被打死。

事後:redis 持久化,一旦重新開機,自動從磁盤上加載資料,快速恢複緩存資料

Redis事務

開啟事務

multi

執行指令隊列中的指令

exec

關閉事務

discard

監視加鎖 watch key

取消監視 unwatch