Redis 知識點

一、redis支持數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。redis

二、redis持久化的兩種方式:RDB和AOF後端

  • RDB持久化是在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork(叉)一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。緩存

    優勢:(1)文件備份只有一個文件,容易查找恢復;(2)災難恢復效率高;安全

    缺點:(1)若是在定時持久化前出現宕機,數據將丟失;(2)RDB是經過fork子進程來協助完成持久化,若是數據集較大會致使服務器短期內中止服務bash

  • AOF持久化以日誌的形式記錄服務器所處理的每個寫、刪除操做,查詢操做不會記錄,以文本的方式記錄,能夠打開文件看到詳細的操做記錄。服務器

    優勢:數據安全性更高,能夠配置同步持久化網絡

    缺點:災難恢復效率低session

三、緩存穿透、緩存擊穿、緩存雪崩及解決方案數據結構

  • 緩存穿透ui

    訪問一個不存在的key,緩存不起做用,請求會穿透到DB,流量大時DB會掛掉。

    解決方案

    • 採用布隆過濾器,使用一個足夠大的bitmap,用於存儲可能訪問的key,不存在的key直接被過濾;
    • 訪問key未在DB查詢到值,也將空值寫進緩存,但能夠設置較短過時時間。
  • 緩存擊穿

    一個存在的key,在緩存過時的一刻,同時有大量的請求,這些請求都會擊穿到DB,形成瞬時DB請求量大、壓力驟增。

    解決方案

    • 在訪問key以前,採用SETNX(set if not exists)來設置另外一個短時間key來鎖住當前key的訪問,訪問結束再刪除該短時間key。
  • 緩存雪崩

    大量的key設置了相同的過時時間,致使在緩存在同一時刻所有失效,形成瞬時DB請求量大、壓力驟增,引發雪崩。

    解決方案

    • 能夠給緩存設置過時時間時加上一個隨機值時間,使得每一個key的過時時間分佈開來,不會集中在同一時刻失效。

四、redis 適合的場景

  • 會話緩存(Session Cache)

    最經常使用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其餘存儲(如Memcached)的優點在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,若是用戶的購物車信息所有丟失,大部分人都會不高興的,如今,他們還會這樣嗎?

    幸運的是,隨着 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣爲人知的商業平臺Magento也提供Redis的插件。

  • 全頁緩存(FPC)

    除基本的會話token以外,Redis還提供很簡便的FPC平臺。回到一致性問題,即便重啓了Redis實例,由於有磁盤的持久化,用戶也不會看到頁面加載速度的降低,這是一個極大改進,相似PHP本地FPC。

    再次以Magento爲例,Magento提供一個插件來使用Redis做爲全頁緩存後端。

    此外,對WordPress的用戶來講,Pantheon有一個很是好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

  • 隊列

    Reids在內存存儲引擎領域的一大優勢是提供 list 和 set 操做,這使得Redis能做爲一個很好的消息隊列平臺來使用。Redis做爲隊列使用的操做,就相似於本地程序語言(如Python)對 list 的 push/pop 操做。

    生產者消費者模式簡單實現過程:

    一、插入數據:

127.0.0.1:6379> lpush list 1
    (integer) 1
    127.0.0.1:6379> lpush list 2
    (integer) 2
    127.0.0.1:6379> lpush list 3
    (integer) 3
    127.0.0.1:6379> lpush list 4
    (integer) 4
複製代碼
二、顯示數據:
複製代碼
127.0.0.1:6379> lrange list 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
複製代碼
三、取出數據:
複製代碼
127.0.0.1:6379> lpop list
    "4"
    127.0.0.1:6379> lpop list
    "3"
    127.0.0.1:6379> lpop list
    "2"
    127.0.0.1:6379> lpop list
    "1"
    127.0.0.1:6379> lpop list
    (nil)

複製代碼
  • 排行榜/計數器

    Redis在內存中對數字進行遞增或遞減的操做實現的很是好。集合(Set)和有序集合(Sorted Set)也使得咱們在執行這些操做的時候變的很是簡單,Redis只是正好提供了這兩種數據結構。

    排行榜簡單實現過程:


一、設置了4個玩家的分數,若是玩家分數已經存在,則會覆蓋以前的分數。
複製代碼
127.0.0.1:6379> zadd ph 90 user
    (integer) 1
    127.0.0.1:6379> zadd ph 80 user1
    (integer) 1
    127.0.0.1:6379> zadd ph 70 user2
    (integer) 1
    127.0.0.1:6379> zadd ph 60 user3
    (integer) 1
複製代碼
二、zscore——查看user2玩家分數
複製代碼
127.0.0.1:6379> zscore ph user2
    "70"
複製代碼
三、zrevrange——按名次查看排行榜
複製代碼
127.0.0.1:6379> zrevrange ph 0 -1 withscores
    1) "user"
    2) "90"
    3) "user1"
    4) "80"
    5) "user2"
    6) "70"
    7) "user3"
    8) "60"
複製代碼
四、查詢前三名玩家分數。
複製代碼
127.0.0.1:6379> zrevrange ph 0 2 withscores
    1) "user"
    2) "90"
    3) "user1"
    4) "80"
    5) "user2"
    6) "70"
複製代碼
五、zrevrank——查看玩家的排名,zrevrank是以分數由高到低的排序返回玩家排名(實際返回的是以0開始的索引),對應的zrank則是以分數由低到高的排序返回排名。
複製代碼
127.0.0.1:6379> zrevrank ph user2
    (integer) 2
    
    127.0.0.1:6379> zrank ph user2
    (integer) 1
複製代碼
六、zrem——移除某個玩家
複製代碼
127.0.0.1:6379> zrem ph user1
    (integer) 1
    127.0.0.1:6379> zrevrange ph 0 -1 withscores
    1) "user"
    2) "90"
    3) "user2"
    4) "70"
    5) "user3"
    6) "60"
複製代碼
七、del——刪除排行榜
複製代碼
127.0.0.1:6379> del ph
    (integer) 1
    127.0.0.1:6379> get ph
    (nil)
    127.0.0.1:6379> zrevrange ph 0 -1 withscores
    (empty list or set)
複製代碼
  • 發佈/訂閱

    最後(但確定不是最不重要的)是Redis的發佈/訂閱功能。發佈/訂閱的使用場景確實很是多。我已看見人們在社交網絡鏈接中使用,還可做爲基於發佈/訂閱的腳本觸發器,甚至用Redis的發佈/訂閱功能來創建聊天系統。

    "發佈/訂閱"模式包含兩種角色,分別是發佈者和訂閱者。訂閱者能夠訂閱一個或者多個頻道(channel),而發佈者能夠向指定的頻道(channel)發送消息,全部訂閱此頻道的訂閱者都會收到此消息。

    發佈/訂閱模式簡單實現過程:

一、訂閱頻道
複製代碼
127.0.0.1:6379> subscribe channel:1
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channel:1"
    3) (integer) 1
複製代碼

執行上面命令客戶端會進入訂閱狀態,處於此狀態下客戶端不能使用除subscribe、unsubscribe、psubscribe和punsubscribe這四個屬於"發佈/訂閱"以外的命令,不然會報錯。

  進入訂閱狀態後客戶端可能收到3種類型的回覆。每種類型的回覆都包含3個值,第一個值是消息的類型,根據消類型的不一樣,第二個和第三個參數的含義可能不一樣。

消息類型的取值多是如下3個:

  (1)subscribe。表示訂閱成功的反饋信息。第二個值是訂閱成功的頻道名稱,第三個是當前客戶端訂閱的頻道數量。

  (2)message。表示接收到的消息,第二個值表示產生消息的頻道名稱,第三個值是消息的內容。

  (3)unsubscribe。表示成功取消訂閱某個頻道。第二個值是對應的頻道名稱,第三個值是當前客戶端訂閱的頻道數量,當此值爲0時客戶端會退出訂閱狀態,以後就能夠執行其餘非"發佈/訂閱"模式的命令了。      

二、發佈消息
複製代碼
127.0.0.1:6379> publish channel:1 hi
    (integer) 1
    127.0.0.1:6379> publish channel:1 nihao
    (integer) 1
複製代碼

返回值表示訂閱此頻道的數量

三、訂閱者接收消息
複製代碼
127.0.0.1:6379> subscribe channel:1
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channel:1"
    3) (integer) 1
    1) "message"
    2) "channel:1"
    3) "hi"
    1) "message"
    2) "channel:1"
    3) "nihao"
複製代碼
相關文章
相關標籤/搜索