- Redis概述
- Redis常用資料結構
- Redis洗掉過期資料策略
- Redis記憶體淘汰機制
- Redis持久化機制
- 快取問題及解決方案
Redis概述
Redis是一個開源的、基于記憶體的資料結構存盤器,可以用作資料庫、快取和訊息中間件Redis最常用的功能
- 快取
- 分布式鎖
-
Windows 10
-
Redis 3.0.504
redis-server redis.windows.conf

Redis常用資料結構
字串(String)
用途
- 存放字串/數字
- 常規key-value快取應用
- 常規計數:訂單數,商品數
| 常用命令 | 用途 |
|---|---|
| set key value | 設定指定 key 的值 |
| get key | 獲取指定key的值 |
| decr key | 將指定的key的值遞減1,若設定的值不是數字,報錯 |
| incr key | 將指定的key的值遞增1,若設定的值不是數字,報錯 |
| mget key1 [key2] | 獲取指定的key,回傳多個值 |

哈希(Hash)
用途
- hash 特別適合用于存盤物件(用戶資訊,商品資訊)
- 可以修改/讀取物件某個值
| 常用命令 | 用途 |
|---|---|
| hset key field value | 設定單個物件值 |
| hget key field value | 獲取的那個物件值 |
| hmset key field1 value [field2 value2] | 設定物件多個欄位值 |
| hmget | 獲取物件多個值 , 回傳串列 |
| hgetall | 獲取指定key物件欄位和值 |

串列(List)
用途
- 雙向鏈表 ,支持反向查找和遍歷
- 可以添加重復資料
- 適合存放訊息串列,產品串列,訂單串列等
| 常用命令 | 用途 |
|---|---|
| lpush key value | 向鏈表左邊推送值 |
| rpush key value | 向鏈表右邊推送值 |
| lpop key | 鏈表的左邊彈出值 |
| rpop key | 鏈表的右邊彈出值 |
| lrange key start end | 鏈表左邊指定范圍內的元素 , 多用于分頁 |
| llen key | 獲取鏈表長度 |

集合(Set)
用途
- 跟串列類似,集合會去重復
| 常用命令 | 用途 |
|---|---|
| sadd key value | 添加一個元素 |
| spop key value | 隨機回傳一個元素 |
| smembers key | 回傳集合所有成員 |
| sunion key1 key2 | 回傳所有給定集合的并集 |

有序集合(Sorted Set)
用途
- 集合中的元素能夠按score進行有序排列
- 多用于排名資料
- score 相同情況下,按字典鍵值排序
| 常用命令 | 用途 |
|---|---|
| zadd key score1 member1 [score2 member2] | 向有序集合添加一個或多個成員,或者更新已存在成員的分數 |
| zrange key start end | 回傳有序集合指定范圍資料 |
| zrem key member | 移除指定成員 |
| zcard key | 獲取集合成員數 |

Redis洗掉過期資料策略
Redis洗掉過期資料有兩種機制
1. 定期洗掉 :redis默認是每隔 100ms 就隨機抽取過期的資料洗掉
2. 惰性洗掉 : 訪問資料的時候檢查資料是否過期
Redis記憶體淘汰機制
當遇到寫入資料的時候記憶體不夠,Redis有下面幾種機制來決定如何操作
| 方式 | 說明 |
|---|---|
| volatile-lru | 從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰 |
| volatile-ttl | 從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰 |
| volatile-random | 從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰 |
| allkeys-lru | 當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key |
| allkeys-random | 從資料集(server.db[i].dict)中任意選擇資料淘汰 |
| noeviction | 禁止洗掉,若超出記憶體報錯 |
| volatile-lfu | 從已設定過期時間的資料集挑選使用頻率最低的資料淘汰(Redis5.0 以后才有) |
| allkeys-lfu | 從資料集中挑選使用頻率最低的資料淘汰(Redis5.0 以后才有) |
在組態檔里面打開maxmemory-policy配置項,默認是:noeviction
通常情況配合maxmemory配置設定最大記憶體使用

Redis持久化機制
Redis支持兩種持久化方式
快照(snapshotting)持久化(RDB)
- Redis可以通過創建快照來獲得存盤在記憶體里面的資料在某個時間點上的副本
- Redis默認采用的持久化方式
- 配置多個save配置項指定觸發創建副本條件,例:save 900 1 , 900秒內至少一個Key發生變化觸發創建快照
- 缺點:若沒達到觸發條件,資料容易丟失
AOF(append-only file)持久化
- 開啟AOF持久化后,根據選擇的方式寫入AOF檔案中
- 配置appendfsync 配置項,配置同步頻率
- 缺點:可能經常發生同步,影響Redis的速度
AOF有3種方式
| 方式 | 說明 |
|---|---|
| appendfsync always | 每次有資料修改發生時都會寫入AOF檔案 ,嚴重降低Redis的速度 |
| appendfsync everysec | 每秒鐘同步一次,顯示地將多個寫命令同步到硬碟 |
| appendfsync no | 讓作業系統決定何時進行同步 |
為了兼顧資料和寫入性能,用戶可以考慮 appendfsync everysec 選項 ,讓 Redis 每秒同步一次 AOF 檔案,Redis 性能幾乎沒受到任何影響,
Redies默認AOF是關閉的,通過修改配置打開

Redis 4.0 對于持久化機制的優化
Redis 4.0 開始支持 RDB 和 AOF 的混合持久化(默認關閉,可以通過配置項 aof-use-rdb-preamble 開啟),
如果把混合持久化打開,AOF 重寫的時候就直接把 RDB 的內容寫到 AOF 檔案開頭,
這樣做的好處是可以結合 RDB 和 AOF 的優點, 快速加載同時避免丟失過多的資料,
當然缺點也是有的,AOF 里面的 RDB 部分是壓縮格式不再是 AOF 格式,可讀性較差,
由于Windows的版本最新只有3.0,這個就沒法驗證
快取問題及解決方案
快取雪崩
同一時間大面積快取失效,大量請求落到資料庫上
解決
- 快取設定過期時間時加上一個隨機值時間,使得每個key的過期時間分布開來,不會集中在同一時刻失效
快取穿透
請求快取不存在的資料,然請求穿透快取到資料庫,通常是黑客攻擊
解決
- 采用布隆過濾器,使用一個足夠大的bitmap,用于存盤可能訪問的key,不存在的key直接被過濾
- 訪問key未在DB查詢到值,也將空值寫進快取,但可以設定較短過期時間
- 采用簽名驗證提交資料
快取擊穿
快取過期的一刻,同時有大量的請求,由于快取失效,導致請求都落到DB
解決
- 單體使用互斥鎖(mutex key)
- 分布式使用setnx
- 雙重校驗訪問快取資料(Double Check),就是執行緒安全的單例模式
轉發請標明出處:https://www.cnblogs.com/WilsonPan/p/12635605.html
參考文章
Command reference – Redis
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/12763.html
標籤:NoSQL
上一篇:mongodb高級聚合查詢
