緩存中間件-Memcache和Redis的區別
Memcache:代碼層次類似Hash
- 支持簡單數據類型
- 不支持數據持久化存儲
- 不支持主從(主從服務器複製)
- 不支持分片
Redis:
- 數據類型豐富
- 支持數據磁盤持久化存儲
- 支持主從
- 支持分片
Redis數據類型
- string:最基本的數據類型,二進制安全
- hash:String元素組成的字典,適合用於存儲對象
- list:列表,按照String元素插入順序排序
- set:無序集合,通過哈希表實現,不允許重複
- zset :有序集合
Redis爲何這麼快
- 完全基於內存,絕大部分請求是純粹的內存操作,執行效率高
- 數據結構簡單,對數據操作也簡單
- 採用單線程,單線程也能處理高併發請求,想要多核也可啓動多Redis實例
- 使用多路I/O複用模型,非阻塞IO
從海量Key裏查詢出某一固定前綴的Key
-
方法一:
使用KEYS pattern命令:查找所有符合給定模式pattern的key
例如查找前綴爲he的key:keys he*
特點:- KEYS指令一次性返回所有匹配的key,速度很慢
- 鍵的數量過大會使服務卡頓(影響線上項目運行速度)
-
方法二:
使用scan cursor [MATCH pattern] [COUNT count] 命令
例如查找前綴爲he的key:scan 0 [MATCH he*] [COUNT 4]
表示的是返回前4個he*前綴的key
特點:- 基於遊標的迭代器,以0作爲遊標起點
- 不保證每次執行都返回給定數量的元素,支持模糊查詢
因此採用scan命令進行海量數據查詢,查詢快速,不會造成服務卡頓。
如何通過Redis實現分佈式鎖
分佈式鎖需要解決的問題:
- 互斥性
- 安全性
- 死鎖
- 容錯
Redis數據持久化
-
RDB(快照)持久化:保存某個時間點的全量數據快照
- SAVE:阻塞Redis的服務器進程,直到RDB文件被創建完畢
- BGSAVE:Fork出一個子進程來創建RDB文件,不阻塞服務器進程
-
AOF(Append-Only-File)持久化:保存寫狀態
- 記錄下所有變更數據庫狀態的指令
- 以append的形式追加保存到AOF文件中(增量)
-
RDB和AOF的優缺點
- RDB優點:全量數據快照,文件小,恢復快。
- RDB缺點:無法保存最近一次快照之後的數據
- AOF優點:可讀性高,適合保存增量數據,數據不易丟失
- AOF缺點:文件體積大,恢復時間長
-
RDB-AOF混合持久化方式:
- BGSAVE做鏡像全量持久化,再使用AOF重放快照之後的操作指令來做增量持久化。
Redis數據的恢復
在RDB和AOF文件共存情況下的恢復流程:
- 先查看AOF文件是否存在,如果存在就加載AOF文件進行恢復
- 如果AOF文件不存在,則查看RDB文件是否存在,存在則加載RDB文件進行回覆