文章目錄
- 問題描述
- 解決方案
- redis概念以及特征
- redis支援的資料類型
- redis支援的進階資料類型
- 持久化
-
- **RDB啟動方式:**
- **AOF(append only file):**
- redis事務與鎖
- redis 删除政策與逐出算法
-
- 删除政策
- 逐出算法
- 主從複制
- 哨兵模式
- 叢集
- MongoDB
問題描述
-
問題現象
海量使用者
高并發
- 罪魁禍首--------關系型資料庫
- 性能瓶頸:磁盤IO性能低下
- 擴充瓶頸:資料關系複雜,擴充性差,不便于大規模叢集
- 解決思路
- 降低磁盤IO次數,越低越好 ------記憶體存儲
- 去除資料間關系,越簡單越好 ---------不存儲關系,僅存儲資料
Nosql:即Not-only SQL(泛指非關系型的資料庫),作為關系型資料庫的補充。
作用: 應對基于海量使用者和海量資料前提下的資料處理問題。
常見的Nosql資料庫:
Redis、memcache、HBase、MongoDB
解決方案

redis概念以及特征
概念:Redis (REmote DIctionary Server) 是用 C 語言開發的一個開源的高性能鍵值對(key-value)資料庫。
特征:
- 資料間沒有必然的關聯關系
- 内部采用單線程機制進行工作
- 高性能
- 多資料類型支援【value的類型】(字元串類型 string、清單類型 list、散列類型 hash、集合類型set、有序集合類型 sorted_set)
- 持久化支援,可以進行資料災難恢複
redis支援的資料類型
String:
- redis用于控制資料庫表主鍵id,為資料庫表主鍵提供生成政策,保障資料庫表的主鍵唯一性(
incr(decr) key/ incrby key increment
)
此方案适用于所有資料庫,且支援資料庫叢集
- redis 控制資料的生命周期,通過資料是否失效控制業務行為,适用于所有具有時效性限定控制的操作(
)setex key seconds value
- redis應用于各種結構型和非結構型高熱度資料通路加速
Hash:
存儲對象資訊,一個存儲空間儲存多個鍵值對資料,底層使用哈希表結構實作資料存儲
- redis 應用于購物車資料存儲設計
- redis 應用于搶購,限購類、限量發放優惠卷、激活碼等業務的資料存儲設計
List:
存儲多個資料,并對資料進入存儲空間的 順序 進行區分,底層使用 雙向連結清單 存儲結構實作
- redis 應用于最新消息展示( 微信朋友圈點贊,要求按照點贊順序顯示點贊好友資訊、騰訊微網誌中個人使用者的關注清單需要按照使用者的關注順序進行展示)
Set:
存儲大量的資料,在查詢方面提供更高的效率,:與hash存儲結構完全相同,僅存儲鍵,不存儲值(nil),并且值是不允許重複的。
- redis 應用于随機推薦類資訊檢索,例如熱點歌單推薦,熱點新聞推薦,熱賣旅遊線路,應用APP推薦,大V推薦等
- redis 應用于同類資訊的關聯搜尋,二度關聯搜尋,深度關聯搜尋(交并比)
- redis 應用于同類型資料的快速去重
- redis 應用于基于黑名單與白名單設定的服務控制
Sorted_set:
資料排序有利于資料的有效展示,需要提供一種可以根據自身特征進行排序的方式,在set的存儲結構基礎上添加可排序字段
- redis 應用于計數器組合排序功能對應的排名
- redis 應用于定時任務執行順序管理或任務過期管理
- redis 應用于即時任務/消息隊列執行管理
redis支援的進階資料類型
Bitmaps:
redis 應用于資訊狀态統計
HyperLogLog:
基數是資料集去重後元素個數
HyperLogLog 是用來做基數統計的,運用了LogLog的算法
GEO:
redis 應用于地理位置計算
持久化
為了防止資料的意外丢失,確定資料安全性,利用永久性存儲媒體将資料進行儲存,在特定的時間将儲存的資料進行恢複的工作機制稱為持久化。
RDB啟動方式:
- save:手動執行一次儲存操作(save指令的執行會阻塞目前Redis伺服器,直到目前RDB過程完成為止,有可能會造成長時間阻塞,線上環境不建議使用。)
- bgsave:手動啟動背景儲存操作,但不是立即執行(bgsave指令是針對save阻塞問題做的優化。Redis内部所有涉及到RDB操作都采用bgsave的方式,save指令可以放棄使用)
- save配置:滿足限定時間範圍内key的變化數量達到指定數量即進行持久化(save second changes second:監控時間範圍,changes:監控key的變化量)
Redis 、MongoDB入門問題描述解決方案redis概念以及特征redis支援的資料類型redis支援的進階資料類型持久化redis事務與鎖redis 删除政策與逐出算法主從複制哨兵模式叢集MongoDB
AOF(append only file):
以獨立日志的方式記錄每次寫指令,重新開機時再重新執行AOF檔案中指令達到恢複資料的目的。與RDB相比可以簡單描述為改記錄資料為記錄資料産生的過程,解決了資料持久化的實時性,目前已經是Redis持久化的主流方式.
AOF寫資料三種政策(appendfsync):always(每次 性能較低)、 everysec(每秒 性能較高)、no(系統控制)
AOF重寫:
随着指令不斷寫入AOF,檔案會越來越大,為了解決這個問題,Redis引入了AOF重寫機制壓縮檔案體積。AOF檔案重寫是将Redis程序内的資料轉化為寫指令同步到新AOF檔案的過程。簡單說就是将對同一個資料的若幹個條指令執行結果轉化成最終結果資料對應的指令進行記錄。
AOF重寫作用:
降低磁盤占用量,提高磁盤使用率
提高持久化效率,降低持久化寫時間,提高IO性能
降低資料恢複用時,提高資料恢複效率
AOF重寫規則:
- 程序内已逾時的資料不再寫入檔案
- 忽略無效指令,重寫時使用程序内資料直接生成,這樣新的AOF檔案隻保留最終資料的寫入指令
- 對同一資料的多條寫指令合并為一條指令
AOF重寫方式:
- 手動重寫(bgrewriteaof)
- 自動重寫(auto-aof-rewrite-min-size size)
redis事務與鎖
開啟事務:
multi
建立隊列
執行事務:
exec
取消事務:
discard
監視鎖: 對 key 添加監視鎖,在執行exec前如果key發生了變化,終止事務執行(
watch key
)
取消對所有 key 的監視(
unwatch
)
分布式鎖: 使用 setnx 設定一個公共鎖(
setnx lock-key value
)
利用setnx指令的傳回值特征,有值則傳回設定失敗,無值則傳回設定成功。對于傳回設定成功的,擁有控制權,進行下一步的具體業務操作;對于傳回設定失敗的,不具有控制權,排隊或等待。 操作完畢通過del操作釋放鎖。
分布式鎖改良: 使用 expire 為鎖key添加時間限定,到時不釋放,放棄鎖(
expire lock-key second
)
redis 删除政策與逐出算法
删除政策
redis 是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過TTL指令擷取其狀态。
xx:具有時效性的資料
-1:永久有效的資料
-2 :已經過期的資料 或 被删除的資料 或 未定義的資料
過期資料删除政策:
-
定時删除(建立一個定時器,當key設定有過期時間,且過期時間到達時,由定時器任務立即執行對鍵的删除操作)
優點:節約記憶體,到時就删除,快速釋放掉不必要的記憶體占用
缺點:CPU壓力很大,無論CPU此時負載量多高,均占用CPU,會影響redis伺服器響應時間和指令吞吐量
總結:用處理器性能換取存儲空間(拿時間換空間)
-
惰性删除(資料到達過期時間,不做處理。等下次通路該資料時,如果未過期,傳回資料;發現已過期,删除,傳回不存在)
優點:節約CPU性能,發現必須删除的時候才删除
缺點:記憶體壓力很大,出現長期占用記憶體的資料
總結:用存儲空間換取處理器性能 (拿時間換空間)
每當get name的時候,會調用expireIfNeeded()檢視是否過期
折中方案
3. 定期删除(周期性輪詢redis庫中的時效性資料,采用随機抽取的政策,利用過期資料占比的方式控制删除頻度)
總結:周期性抽查存儲空間(随機抽查,重點抽查)
逐出算法
Redis使用記憶體存儲資料,在執行每一個指令前,會調用
freeMemoryIfNeeded()
檢測記憶體是否充足如果記憶體不滿足新加入資料的最低存儲要求,redis要臨時删除一些資料為目前指令清理存儲空間。清理資料的政策稱為逐出算法。
主從複制
哨兵模式
哨兵(sentinel) 是一個分布式系統,用于對主從結構中的每台伺服器進行監控,當出現故障時通過投票機制選擇新的master并将所有slave連接配接到新的master。哨兵也是一台redis伺服器,隻是不提供資料服務。通常哨兵配置數量為單數
哨兵的作用:
- 監控(不斷的檢查master和slave是否正常運作。master存活檢測、master與slave運作情況檢測)
- 通知/提醒(當被監控的伺服器出現問題時,向其他(哨兵間,用戶端)發送通知。)
- 自動故障轉移(斷開master與slave連接配接,選取一個slave作為master,将其他slave連接配接到新的master,并告知用戶端新的伺服器位址)
叢集
叢集就是使用網絡将若幹台計算機聯通起來,并提供統一的管理方式,使其對外呈現單機的服務效果
叢集作用:
分散單台伺服器的通路壓力,實作負載均衡
分散單台伺服器的存儲壓力,實作可擴充性
降低單台伺服器當機帶來的業務災難
叢集資料存儲設計:
- 通過算法設計,計算出key應該儲存的位置
- 将所有的存儲空間計劃切割成16384份,每台主機儲存一部分,每份代表的是一個存儲空間,不是一個key的儲存空間
- 将key按照計算出的結果放到對應的存儲空間
叢集内部通訊設計:
- 各個資料庫互相通信,儲存各個庫中槽的編号資料
- 一次命中,直接傳回
- 一次未命中,告知具體位置
緩存預熱:
緩存預熱就是系統啟動前,提前将相關的緩存資料直接加載到緩存系統。避免在使用者請求的時候,先查詢資料庫,然後再将資料緩存的問題!使用者直接查詢事先被預熱的緩存資料!
緩存雪崩:
問題:短時間範圍内,大量key集中過期
緩存雪崩就是瞬間過期資料量太大,導緻對資料庫伺服器造成壓力。如能夠有效避免過期時間集中,可以有效解決雪崩現象的出現(約40%),配合其他政策一起使用,并監控伺服器的運作資料,根據運作記錄做快速調整
緩存擊穿:
問題:單個key高熱資料,key過期
緩存擊穿就是單個高熱資料過期的瞬間,**資料通路量較大,未命中redis後,發起了大量對同一資料的資料庫通路,**導緻對資料庫伺服器造成壓力。應對政策應該在業務資料分析與預防方面進行,配合運作監控測試與即時調整政策,畢竟單個key的過期監控難度較高,配合雪崩處理政策即可。
緩存穿透:
問題:redis中大面積出現未命中,出現非正常URL通路
緩存擊穿通路了不存在的資料,跳過了合法資料的redis資料緩存階段,每次通路資料庫,導緻對資料庫伺服器造成壓力。通常此類資料的出現量是一個較低的值,當出現此類情況以毒攻毒,并及時報警。應對政策應該在臨時預案防範方面多做文章。
無論是黑名單還是白名單,都是對整體系統的壓力,警報解除後盡快移除。
=====================================================================================
MongoDB
MongoDB是一個開源、高性能、無模式的文檔型資料庫,當初的設計就是用于簡化開發和友善擴充,是NoSQL資料庫産品中的一種。是最像關系型資料庫(MySQL)的非關系型資料庫。BTree存儲結構。不支援事務,支援索引遊标等操作,優勢在于查詢功能比較強大,擅長查詢JSON資料,能存儲海量資料。
它支援的資料結構非常松散,是一種類似于 JSON 的 格式叫BSON,是以它既可以存儲比較複雜的資料類型,又相當的靈活。
MongoDB的最小存儲機關就是文檔(document)對象。文檔(document)對象對應于關系型資料庫的行。資料在MongoDB中以
BSON(Binary-JSON)文檔的格式存儲在磁盤上。