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
參考文章