Redis 功能原理分析
過時時間設置redis
- EXPIRE key seconds
- EXPIRE命令的seconds命令必須是整數,因此最小單位是1秒
- PEXPIRE命令的單位是毫秒
- 一個鍵還有多久時間被刪除,可使用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上的全部訂閱者
![](http://static.javashuo.com/static/loading.gif)
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版本是基於採樣的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操做的方式是阻塞仍是非阻塞
歡迎關注本站公眾號,獲取更多信息