一、redis應用
1、記錄帖子(zǐ)點贊數、評論數和(hé)點擊數(hash)
2、記錄用戶的帖子(zǐ)ID列表,便于快速顯示用戶的帖子(z藍從ǐ)列表(zset)
3、記錄帖子(zǐ)的标題、摘要、作者和(hé)喝去封面信息,用戶列表頁展示(hash)
4、記錄帖子(zǐ)的點贊用戶ID列表,評論ID列表,用舊女于顯示和(hé)去重計數(hash)
5、緩存近期熱帖内容(帖子(zǐ)内容的空間占用比較大),減少(shǎo)但校數據庫壓力(hash)
6、記錄帖子(zǐ)的相關(guān)文(wén)章ID,根據内容推薦視間相關(guān)帖子(zǐ)(list)
7、如(rú)果帖子(zǐ)ID是整數自增的,可(kě)以使用red哥件is來分配帖子(zǐ)ID(計數器(qì))
8、收藏集和(hé)帖子(zǐ)之間的關(guān)系(zset)
9、記錄熱榜帖子(zǐ)ID列表、總熱榜和(hé)分類熱榜(zset)
10、緩存用戶行為曆史,過濾惡意行為(zset、hash)
11、保證同一用戶不會中(zhōng)獎兩次(se志都t)
二、redis數據結構
string(字符串)、list(列表)、hash(字典)、set(村為集合)、zset(有序集合)
1. string(字符串)
其内部字符串是一個(gè)動(dòng)态字符串,謝線類似于ArrayList的動(dòng)态擴容。以此減少(shǎo)頻繁科大分配内存的開銷。字符串長度小于1M時,成倍擴容;大于1M時,隻增加1M;最大照務長度512M。
使用場景:
緩存用戶登錄信息。token作為key,用戶信息使用JSON序綠妹列化成字符串,獲取時再反序列化。
常用命令
set name value #存值
get name 哥船#取值
exists name #判斷
del name
mset name1 name2 value1 value2 銀東 #批量取
mget name1 name2 .....女科 #批量取
expire name m秒 #m秒後她我過期
setex name m秒 value&nbs年問p; #存值,并且設置過期時間得湖
setnx name value 花南#存值,如(rú)果name已經存在,就返回0
set name 1 #設置為整數
incr name #還可(kě)說可以自增
incrby name 整數 #加
2. list(列表)
類似于LinkedList。插入删除塊,查詢慢。
使用場景
常用于異步隊列實現(先進先出)
常用命令
rpush name value1 value2... #入隊
llen name #隊列長度
lpop name #出隊 value1
3. hash(字典)
類似于HashMap
使用場景
可(kě)以對存儲結構中(zhōng)每個(gè)字段單獨存儲。科拍過期時間是針對真個(gè)hash對象,而不是單獨的土討子(zǐ)key.
常用命令
hset key filed1 value1
hset key filed2 value2  白大;#存
hget key filed1 #著都取
4. set(集合)
sadd, smembers, scard
5. zset(有序集合)
zadd, zrange,zrank, zrem,zcard熱地
三、HyperLogLog
場景:估數、精确度要求不高場景(統計網站(zh書金àn)的PV 和(hé)UV)
命令 pfadd、pfcount、pfmerge
内存占用比set小,有一定的誤差
四、布隆過濾器(qì)
原理:布隆過濾器(qì)是一個(gè)BIT數組
場景:信息推薦去重(微博推薦刷新時過濾已經看過的信息),垃圾郵刀從件過濾、爬蟲系統過濾已爬内容、解決緩存穿透制路問(wèn)題
布隆過濾器(qì)可(kě)以判斷某個(gè)他低數據一定不存在,但是無法判斷一定存在(不精确的SET)
占用内存極少(shǎo),并且插入和(h房輛é)查詢速度都足夠快。
缺點,無法删除數據;随着數據的增加,誤判率會增加
Redisson 實現
五、Reids6種淘汰策略
volatile-lru:從設置了過期時間的數據集中(她上zhōng),選擇最近最久未使用的數據釋算笑放;
allkeys-lru:從數據集中(zhōng)(包行船括設置過期時間以及未設置過期時間的數據集中(zhōng)),選擇最愛去近最久未使用的數據釋放;
volatile-random:從設置了過期時可樹間的數據集中(zhōng),随機選擇一個(gè)數據地草進行釋放;
allkeys-random:從數據集中(zhōng)(草行包括了設置過期時間以及未設置過期時間)随機選擇一個(gè)數據進行入釋放;
volatile-ttl:從設置了過期時間的數據集中(zhōng低弟),選擇馬上就要過期的數據進行釋放操作;
noeviction:不删除任意數據(但redis還會根據引用計老東數器(qì)進行釋放),這時如(rú)果内存不夠時,會直接返回司湖錯誤。
默認策略是noeviction
推薦使用的策略是volatile-lru
通(tōng)過maxmemory-samples配置樣本數量很時,默認為5
緩存淘汰算法(LFU、LRU、ARC、FIFO、MRU秒媽)
六、Redis 持久化方案:
RDB 默認方式 (RDB持久化即通(tōng短線)過創建快照的方式進行持久化,保存某個(gè)時器答間點的全量數據。)
AOF (Append-Only-File持久報書化即記錄所有變更數據庫狀态的指令,以append章家的形式追加保存到AOF文(wén)件中(zhōng)電自)
如(rú)果Redis隻是用來做緩存服務器(qì),哥錢比如(rú)數據庫查詢數據後緩存,那可(kě件吃)以不用考慮持久化,因為緩存服務失效還能再從數據庫獲取恢複。
七、緩存和(hé)數據庫數據一緻性(并發競争問(wèn)題)
延時雙删策略(在寫庫前、後進行redis.del,并且設定合理的延時厭藍時間。)
讀取binlog分析 ,利用消息隊列(r朋劇abbitmq、kafka), 推送更新各台的redis緩存數據
八、緩存穿透
現象:用戶大量并發請求的數據(key)對應的數據在redis和(hé鐘雨)數據庫中(zhōng)都不存在,導緻盡管數據不存在但煙唱還是每次都會進行查DB。
解決方案:從緩存取不到的數據,在數據庫中(z喝到hōng)也沒有取到,這時也可(kě)以将key-value對寫為ke你答y-null
九、緩存擊穿
現象:緩存擊穿是指緩存中(zhōng)沒有但數據庫中(zhōng)有飛行的數據(一般是緩存時間到期),這時由于并發用戶特别多,同時讀緩存沒讀低事到數據,又同時去數據庫去取數據,引起數據庫壓力瞬間增大,造但冷成過大壓力。
解決方案:
1.設置熱點數據永遠(yuǎn)不過期
2.接口限流與熔斷,降級
3.加互斥鎖
4.布隆過濾器(qì)
十、緩存雪(xuě)崩
現象:大量key同一時間點失效,同時又有大量請求打進來,導緻流日拿量直接打在DB上,造成DB不可(kě)用。
解決方案:
1.設置key永不失效(熱點數據);
2.設置key緩存失效時候盡可(kě)能錯開;新都
3.使用多級緩存機制,比如(rú)同時使用redsi和筆從(hé)memcache緩存,請求-&g東數t;redis->memcache->db;
4.購買第三方可(kě)靠性高的Redis雲服務器(qì);
十一、Redis熱點key處理
1 熱點key發現
監控熱key(抓包程序抓redis監聽端口的數據土地,抓到數據後往kafka裡丢。接下(xià)來,flink流式計算系統房西消費kafka裡的數據,進行數據統計即可(k秒不ě))
通(tōng)知系統做處理
2 解決方案
本地緩存
集群(把這個(gè)熱key,在多個(gè)redis上都存一份)
阿裡雲Redis已經在内核層面解決熱點k謝這ey問(wèn)題
3. 熱key的危害
流量集中(zhōng),達到物理網卡上限。
請求過多,緩存分片服務被打垮。
DB 擊穿,引起業(yè)務雪(xuě)崩。
十二、拒絕大KEY
集群環境,大key會導緻數據遷移卡頓
如(rú)果被删除時,内存一次性回收,也會卡頓
擴容時,會一次性申請更大的内存,也會卡頓
注意:如(rú)果Redis内存起伏較大,很有可(kě)能是大電湖key導緻,這時需要定位大key并優化
定位大key可(kě)以使用scan、或者redis-cli指令完成
十三、Redis是單線程的,但Redis高黃為什麼這麼快
1、基于内存
2、數據結構和(hé)操作簡單
3、多路(lù)I/O複用模型(非阻塞IO)
4、單線程避免了不必要的上下(xià)文(wén)切換和(hé)競生畫争條件
十四、漏鬥限流
分布式限流:redis-cell
單機:Google的guava包提供了RateLimiter類
限流的常見算法有以下(xià)三種:
1.時間窗口算法
2.漏桶算法
3.令牌算法
十五、GEO
Redis通(tōng)過GeoHash算法實現附如船近的人查詢功能;
内部數據結構是zset,通(tōng)過score還原就可(kě裡聽)以得到原始坐(zuò)标;
集群環境中(zhōng)單個(gè)key對應的數頻匠據不宜超過1M,如(rú)果超過需要按相應業(yè高店)務規則拆分降低key的數據大小。
十六、scan
通(tōng)過遊标分步進行,相比于keys,不會阻塞樹月線程
提供limit參數可(kě)以控制返回結果條數