Redis-基礎和(hé)應用篇

分類:└ 技術(shù)前沿,來源:江門市深圳市巨鳥網絡科技有限公司他問有限公司

一、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ě)以控制返回結果條數