Redis之使用和優化

2022-03-18 22:09:30 字數 2862 閱讀 7816

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=100

2 設定使用者資訊快取:set user:100select * from user where id=100

3 快取粒度:

​ 快取全部屬性

​ 快取部分重要屬性

1 通用性:全量屬性更好

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...