Redis 功能原理分析

過時時間設置redis

  • EXPIRE key seconds
    • EXPIRE命令的seconds命令必須是整數,因此最小單位是1秒
    • PEXPIRE命令的單位是毫秒
      • PTTL以毫秒單位獲取鍵的剩餘有效時間
  • 一個鍵還有多久時間被刪除,可使用TTL命令
    • TTL key
      • 當鍵不存在時,TTL命令會返回-2
      • 沒設置過時時間,-1

過時刪除的原理算法

  • 消極方法(passive way)
    • 主鍵被訪問時若是發現它已經失效,那麼就刪除它
  • 積極方法(active way)
    • 週期性地從設置了失效時間的主鍵中選擇一部分失效的主鍵刪除
  • Redis每秒會進行10次操做,具體的流程:
    • 隨機測試 20 個帶有timeout信息的key;
    • 刪除其中已通過期的key;
    • 若是超過25%的key被刪除,則重複執行步驟1;
    • 這是一個簡單的機率算法(trivial probabilistic algorithm),
      • 基於假設咱們隨機抽取的key表明了所有的key空間。

Redis發佈訂閱設計模式

  • Redis提供了一組命令可讓開發者實現「發佈/訂閱」模式(publish/subscribe) 
  • 值得注意的是消息發送出去不會持久化,
    • 若是發送以前沒有訂閱者,
    • 那麼後續再有訂閱者訂閱該頻道,以前的消息就收不到了
  • 結構圖
    • channel分兩類,
      • 一個是普通channel、
      • 另外一個是pattern channel(規則匹配),
      • producer1發佈了一條消息【publish abc hello】,
        • redis server發給abc這個普通channel上的全部訂閱者,
        • 同時abc也匹配上了pattern channel的名字,
        • 因此這條消息也會同時發送給pattern channel *bc上的全部訂閱者

 

Redis內存回收策略緩存

  • Redis中提供了多種內存回收策略,當內存容量不足時,
    • 就不得不淘汰內存中的一些對象,釋放這些對象佔用的空間
  • 默認的策略爲noeviction策略,
    • 當內存使用達到閾值的時候,全部引發申請內存的命令會報錯
  • allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
    • 適合的場景: 若是咱們的應用對緩存的訪問都是相對熱點數據,那麼能夠選擇這個策略
  • allkeys-random:隨機移除某個key。
    • 適合的場景:若是咱們的應用對於緩存key的訪問機率相等,則可使用這個策略
  • volatile-random:從已設置過時時間的數據集(server.db[i].expires)中
    • 任意選擇數據淘汰。
  • volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選
    • 最近最少使用的數據淘汰。
  • volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選
    • 將要過時的數據淘汰
  • 適合場景:這種策略使得咱們能夠向Redis提示哪些key更適合被淘汰,咱們能夠本身控制

總結安全

  • 實際上Redis實現的LRU並非可靠的LRU
    • 若是須要在全部的數據中搜索最符合條件的數據,那麼必定會增長系統的開銷,
      • Redis是單線程的,因此耗時的操做會謹慎一些
    • 早期的Redis版本是基於採樣的LRU
      • Redis3.0版本以後,Redis做者對於基於採樣的LRU進行了一些優化
      • 目的是在必定的成本內讓結果更靠近真實的LRU。

Redis是單進程單線程?性能爲何這麼快服務器

  • Redis採用了一種很是簡單的作法
    • Redis把任務封閉在一個線程中從而避免了線程安全問題;
  • redis爲何是單線程?
    • 官方的解釋是,CPU並非Redis的瓶頸所在,
    • Redis的瓶頸主要在機器的內存網絡的帶寬
  • 那麼Redis能不能處理高併發請求呢?
    • 固然是能夠的,至於怎麼實現的,咱們來具體瞭解一下。
      • 【注意併發不等於並行,
        • 併發性I/O流意味着可以讓一個計算單元來處理來自多個客戶端的流請求。
        • 並行性,意味着服務器可以同時執行幾個事情,具備多個計算單元】
  • 多路複用
    • Redis 是跑在單線程中的,全部的操做都是按照順序線性執行的,
      • 可是因爲讀寫操做等待用戶輸入或輸出都是阻塞的
      • 因此 I/O 操做在通常狀況下每每不能直接返回,
      • 這會致使某一文件的 I/O 阻塞致使整個進程沒法對其它客戶提供服務,
      • I/O 多路複用就是爲了解決這個問題而出現的。

幾種I/O模型網絡

  • 同步阻塞IO(Blocking IO):即傳統的IO模型。
  • 同步非阻塞IO(Non-blocking IO):
    • 默認建立的socket都是阻塞的,
    • 非阻塞IO要求socket被設置爲NONBLOCK。
  • IO多路複用(IO Multiplexing):
    • 即經典的Reactor設計模式,也稱爲異步阻塞IO,
    • Java中的Selector和Linux中的epoll都是這種模型。
  • 異步IO(Asynchronous IO):即經典的Proactor設計模式,也稱爲異步非阻塞IO。
  • 同步和異步,指的是用戶線程和內核的交互方式
  • 阻塞和非阻塞,指用戶線程調用內核IO操做的方式是阻塞仍是非阻塞
相關文章
相關標籤/搜索