##redis是什麼? Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 redis是一個key-value存儲系統。和Memcached ...
redis是什麼?
Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。
這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。
redis的優點:
1、本質上是一個 Key-Value 類型的記憶體資料庫,很像memcached
2、整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫數據 flush 到硬碟上進行保存
3、因為是純記憶體操作,Redis 的性能非常出色,每秒可以處理超過 10 萬次讀寫操作,是已知性能最快的Key-Value DB
4、Redis最大的魅力是支持保存多種數據結構(string,list,set,hash,sortedset),此外單個 value 的最大限制是 1GB,不像memcached只能保存 1MB 的數據
5、Redis也可以對存入的 Key-Value 設置 expire 時間,因此也可以被當作一個功能加強版的memcached 來用
缺點:
1、Redis 的主要缺點是資料庫容量受到物理記憶體的限制,不能用作海量數據的高性能讀寫,因此 Redis 適合的場景主要局限在較小數據量的高性能操作和運算上。
Redis預設支持16個資料庫,
可以通過配置databases來修改這一數字。客戶端與Redis建立連接後會自動選擇0號資料庫,不過可以隨時使用select命令更換資料庫。
Redis支持多個資料庫,並且每個資料庫是隔離的不能共用,並且基於單機才有,如果是集群就沒有資料庫的概念
埠:6379
緩存穿透:
概述:指查詢一個一定不存在的數據,如果從存儲層查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到 DB 去查詢,可能導致 DB 掛掉。(redis查詢不到資料庫,出現很多非正常的url訪問---黑客攻擊)
現象:應用伺服器壓力變大, redis命中率降低 ,一直都是在查詢資料庫
解決方案:
1、查詢返回的數據為空,仍把這個空結果進行緩存,但過期時間會比較短
2、布隆過濾器:將所有可能存在的數據哈希到一個足夠大的 bitmap 中,一個一定不存在的數據會被這個 bitmap 攔截掉,從而避免了對DB的查詢
3、設置可訪問的白名單
4、進行實時的監控
緩存擊穿:
概述:對於設置了過期時間的key,緩存在某個時間點過期的時候,恰好這時間點對這個Key有大量的併發請求過來,這些請求發現緩存過期一般都會從後端 DB 載入數據並回設到緩存,這個時候大併發的請求可能會瞬間把 DB 壓垮。(redis的某個key過期了,並大量訪問這個key)
現象:資料庫訪問瞬時增加, redis裡面沒有出現大量key過期 , redis正常運行
解決方案:
1、使用互斥鎖:當緩存失效時,不立即去load db,先使用如 Redis 的 setnx 去設置一個互斥鎖,當操作成功返回時再進行 load db的操作並回設緩存,否則重試get緩存的方法
2、永遠不過期:不要對這個key設置過期時間
3、預先設置熱門的數據
緩存雪崩:
概述:設置緩存時採用了相同的過期時間,導致緩存在某一時刻同時失效,請求全部轉發到DB,DB 瞬時壓力過重雪崩。與緩存擊穿的區別:雪崩是很多key,擊穿是某一個key緩存。(大量的key同時過期)
現象:資料庫的壓力變大伺服器崩潰 --雪崩效應對底層的系統衝擊非常大
解決方案:
1.構建多級架構(nginx緩存+ redis緩存 + 其它的緩存)
2.使用鎖或者隊列(避免大量的線程堆資料庫進行一次性讀寫)
3.設置過期標誌,更新緩存
4.將緩存失效時間分散開,比如可以在原有的失效時間基礎上增加一個隨機值,比如1-5分鐘隨機,這樣每一個緩存的過期時間的重覆率就會降低,就很難引發集體失效的事件。
本文來自博客園,作者:阿薩德菩提子,轉載請註明原文鏈接:https://www.cnblogs.com/ychptz/p/16625855.html