1 加速讀寫2 降低後端負載:後端伺服器通過前端快取降低負載,業務端使用redis降低後端mysql負載
1 資料不一致:快取層和資料層有時間視窗不一致,和更新策略有關2 **維護成本:多了一層快取邏輯
3 運維成本:比如使用了redis cluster
1 降低後端負載:對高消耗的sql,join結果集/分組統計的結果做快取2 加速請求響應:利用redis優化io響應時間
3 大量寫合併為批量寫:如計數器先redis累加再批量寫入db
1 lru/lfu/fifo演算法剔除:例如maxmemory-policy(到了最大記憶體,對應的應對策略) lru -least recently used,沒有被使用時間最長的
lfu -least frequenty user,一定時間段內使用次數最少的
fifo -first in first out
lirs (low inter-reference recency set)是乙個頁替換演算法,相比於lru(least recently used)和很多其他的替換演算法,lirs具有較高的效能。這是通過使用兩次訪問同一頁之間的距離(本距離指中間被訪問了多少非重複塊)作為一種尺度去動態地將訪問頁排序,從而去做乙個替換的選擇
配置檔案中設定:
# lru配置
maxmemory-policy:volatile-lru
(1)noeviction: 如果記憶體使用達到了maxmemory,client還要繼續寫入資料,那麼就直接報錯給客戶端
(2)allkeys-lru: 就是我們常說的lru演算法,移除掉最近最少使用的那些keys對應的資料,ps最長用的策略
(3)volatile-lru: 也是採取lru演算法,但是僅僅針對那些設定了指定存活時間(ttl)的key才會清理掉
(4)allkeys-random: 隨機選擇一些key來刪除掉
(5)volatile-random: 隨機選擇一些設定了ttl的key來刪除掉
(6)volatile-ttl: 移除掉部分keys,選擇那些ttl時間比較短的keys
# lfu配置 redis4.0之後為maxmemory_policy淘汰策略新增了兩個lfu模式:
volatile-lfu:對有過期時間的key採用lfu淘汰演算法
allkeys-lfu:對全部key採用lfu淘汰演算法
# 還有2個配置可以調整lfu演算法:
lfu-log-factor 10
lfu-decay-time 1
# lfu-log-factor可以調整計數器counter的增長速度,lfu-log-factor越大,counter增長的越慢。
# lfu-decay-time是乙個以分鐘為單位的數值,可以調整counter的減少速度
2 超時剔除:例如expire,設定過期時間策略3 主動更新:開發控制生命週期
一致性維護成本
lru/lirs演算法剔除最差低
超時剔除較差低
主動更新強高
1 低一致性:最大記憶體和淘汰策略
2 高一致性:超時剔除和主動更新結合,最大記憶體和淘汰策略兜底
1 從mysql獲取使用者資訊:select * from user where id=1001 通用性:全量屬性更好2 設定使用者資訊快取:set user:100
select * from user where id=100
3 快取粒度:
快取全部屬性
快取部分重要屬性
2 占用空間:部分屬性更好
3 **維護:表面上全量屬性更好
### 快取穿透
#描述:
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為「-1」的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。
#解決方案:
1 介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截;
2 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key-value對寫為key-null,快取有效時間可以設定短點,如30秒(設定太長會導致正常情況也沒法使用)。這樣可以防止攻擊使用者反覆用同乙個id暴力攻擊
3 通過布隆過濾器實現
### 快取擊穿
#描述:
快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力
#解決方案:
設定熱點資料永遠不過期。
### 快取雪崩
#描述:
快取雪崩是指快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。和快取擊穿不同的是, 快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。
# 解決方案:
1 快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
2 如果快取資料庫是分布式部署,將熱點資料均勻分布在不同搞得快取資料庫中。
3 設定熱點資料永遠不過期。
redis優化之PipeLine管道
首先我們使用普通的redistemplate進行操作 配置完之後,思考下為啥pipeline可以優化redis的效能?什麼時候使用?redis是單執行緒的,io多路復用,它需要在前乙個請求處理完成之後,再處理下乙個請求。如果說有很多請求忽然傳送過來,那麼也會影響redis的效能,pipeline可以...
Redis使用優化技巧(java)
redis是經常使用的資料中間層,讀去快速,而且功能詳細豐富。下面介紹一些工作中使用redis降低功能耗時的小技巧 1.每一類資料,可以設定為乙個主key,然後在value中詳細描述分布。避免或者不要用模糊查詢。可以用乙個list放所有相關key,然後用key去依次查詢,如果還要單獨查key,就用h...
redis使用優化總結學習
在redis的使用中,因為其是單程序在執行,所有在實際使用的過程中因為實際情況可能經常需要進行優化。所以,蒐集了資料學習總結下。1,redis中主要的儲存方式key value模型的儲存方式,在其內部提供了多種的資料型別,可根據實際的情況使用對用的結構型別。目前發現在實際情況,基本上都是用的hash...