Redis簡介
MySQL中的數據都是存儲在緩存中的,雖然在數據庫中做了對應的緩存,一般針對的是查詢的內容,而且粒度比較小,並且當數據庫內容不發生變更的時候,緩存纔有作用。不能減輕業務系統對數據庫的增刪改查IO壓力。因此緩存數據庫應運而生,實現對熱點數據的緩存,提高了響應速度,緩解後端數據庫的壓力。
- 穿透:穿透緩存層,訪問數據庫層
- 熔斷:不管有沒有獲得數據都返回,在有損的情況下,對外提供服務
緩存中間件
Memcache和Redis的區別
Memcache:代碼層次類似Hash
- 支持簡單數據類型
- 不支持數據持久化存儲
- 不支持主從
- 不支持分片
Redis
- 數據類型豐富
- 支持數據磁盤持久化存儲
- 支持主從
- 支持分片
爲什麼Redis能這麼快
100000+QPS
- 完全基於內存,絕大部分的請求是純粹的內存操作,執行效率高
- 數據結構簡單(鍵值對),對數據的操作也簡單
- 採用了單線程,單線程也能處理高併發請求,想多核也可以啓動多實例
- 使用多路I/O複用模型,非阻塞IO
I/O多路複用模型
- FD:文件描述符。一個打開的文件通過唯一的描述符進行應用,該描述符是打開文件的源數據到文件本身的映射。
- Select系統調用:Selector負責監聽這些文件是否可讀或者可寫
- Redis採用的I/O多路複用函數:epoll/kqueue/evport/select?
- 因地制宜:編譯平臺不同
- 優先選擇時間複雜度爲O(1)
- 以時間複雜度爲O(n)的select爲保底:掃描全部監聽的文件
- 基於react設計模式監聽I/O事件:實現文件事件處理器
Redis簡介
供用戶使用的數據類型
- String:最基本的數據類型,可以存儲序列化對象,二進制圖
- Hash:String元素組成的字典,適合用於存儲對象
- List:列表,按照String元素插入順序排列(類似棧)
- Set:String元素組成的無需集合,通過hash表實現,不允許重複
- Sorted Set:通過分數來爲集合中的成員從小到大排序(增加權重)
- 用於計數的HyperLogLog,用於支持存儲地理位置信息的Geo