針對緩存在Redis中的聊天消息的持久化方案分析
選型依據(jù)
數(shù)據(jù)庫的選型主要考慮一下幾個方面:
- 數(shù)據(jù)庫本身是否收費
- 數(shù)據(jù)庫后期維護成本
- 是否支持水平及垂直擴展,及擴展的容易程度
- 業(yè)務數(shù)據(jù)本身特性
- 使用此數(shù)據(jù)庫的開發(fā)成本
由于此數(shù)據(jù)庫主要用來存儲緩存在redis中的用戶發(fā)送的消息,對用戶發(fā)送的消息進行持久化,主要用作以后的分析與查找,本身業(yè)務價值不大。redis數(shù)據(jù)的存儲方式為 key-value。本來通過對常用的關系型數(shù)據(jù)庫與非關系型數(shù)據(jù)庫進行對比分析,選擇適合本業(yè)務需求的最佳數(shù)據(jù)庫。
關系型數(shù)據(jù)庫
對關系型數(shù)據(jù)庫的分析主要分析SqlServer 、Oracle、MySql
Sql Server
SQLServer只能在windows上運行,所以不做考慮。
Oracle
優(yōu)點
- 引入了共享SQL和多線索服務器體系結構。這減少了ORACLE的資源占用,并增強了ORACLE的能力,使之在低檔軟硬件平臺上用較少的資源就可以支持更多的用戶
- 提供了基于角色(ROLE)分工的安全保密管理。在數(shù)據(jù)庫管理功能、完整性檢查、安全性、一致性方面都有良好的表現(xiàn)。
- 支持大量多媒體數(shù)據(jù),如二進制圖形、聲音、動畫以及多維數(shù)據(jù)結構等。
- 提供了新的分布式數(shù)據(jù)庫能力。可通過網(wǎng)絡較方便地讀寫遠端數(shù)據(jù)庫里的數(shù)據(jù),并有對稱復制的技術。
缺點
- 費用較高
- 管理維護成本高
- 對硬件的要求很高
- 對管理員經(jīng)驗、經(jīng)驗要求很高
- 數(shù)據(jù)庫崩潰后恢復比較困難
MySql
優(yōu)點
- Mysql是免費開源的
- Mysql是可以定制的,采用了GPL協(xié)議,你可以修改源碼來開發(fā)自己的Mysql系統(tǒng)
- MySQL不僅能夠作為一個單獨的應用程序應用在客戶端服務器網(wǎng)絡環(huán)境中,也能作為一個庫而嵌入到其他的軟件中
- 支持多線程,使CPU資源得到充分利用
- 支持特大型的數(shù)據(jù)庫。
- 使用C和C++編程語言編寫,且可以使用多種編譯器進行測試,保證源代碼的可移植性,安裝簡單小巧
- 提供用于管理、檢查、優(yōu)化數(shù)據(jù)庫操作的管理工具
缺點
- MySQL在穩(wěn)定性和集群方面存在一些問題。除非使用收費版本
![image.png]()
- 完全免費的MySQL安裝集群式非常困難的。
- 當表數(shù)據(jù)非常大時,修改表數(shù)據(jù)結構會鎖定整個表結構
非關系型數(shù)據(jù)庫
由于chat的業(yè)務需求為持久化緩存在resis中的用戶交互信息。因此詳細介紹面向文檔的數(shù)據(jù)庫 MongoDB,MongoDB中的文檔類似于JSON對象。
什么是MongoDB
MongoDB是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。在高負載的情況下,添加更多的節(jié)點,可以保證服務器性能。MongoDB旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB將數(shù)據(jù)存儲為一個文檔,數(shù)據(jù)結構有鍵值(key=>value)對組成。MongoDB文檔類似于JSON對象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
MongoDB的功能
- MongoDB可以實現(xiàn)范圍查詢、數(shù)據(jù)集包含查詢、不等式查詢,以及其他一些查詢。
- 可以通過MongoDB對數(shù)據(jù)進行分析并加以利用,MongoDB提供的聚合工具有:聚合框架、MapReduce、及幾個簡單的聚合命令:count、distinct和group
- 副本集 (將數(shù)據(jù)副本保存到多臺服務器上)
- 自動分片(類似于關系型數(shù)據(jù)庫的分表)
- MongoDB除支持MySQL的常用索引外,還支持TTL索引
- 自動清除:MongoDB還提供了受限集合,當受限集合到達上限時,舊文檔會被自動清除。如果想讓基于時間而不是整個集合的大小,可以用TTL索引
- 內(nèi)置GridFS ,支持大容量存儲(GridFS是一個出色的分布式文件系統(tǒng),可以支持海量的數(shù)據(jù)存儲)
MongoDB 的優(yōu)勢
- 寫入高性能:存儲引擎使用的內(nèi)存映射文件(MMAP的方式),將內(nèi)存管理工作交給操作系統(tǒng)去處理。MMAP的機制,數(shù)據(jù)的操作寫內(nèi)存即是寫磁盤,在保證數(shù)據(jù)一致性的前提下,提供了較高的性能。
- 易于擴展:MongoDB支持自動分片(分片就是講數(shù)據(jù)拆分,將其分散存放在不同機器上的過程)。MongoDB自動處理數(shù)據(jù)在分片上的分布,也更容易添加和刪除分片。
- 對非事務安全,MongoDB很適合業(yè)務系統(tǒng)中有大量“低價值”數(shù)據(jù)的場景
- 無模式(不像關系型數(shù)據(jù)庫,先定義表結構)
不適合使用MongoDB的場景
- MongoDB不支持事務,對事務性有要求的應用程序不建議使用MongoDB
- 在多個不同緯度上對不同類型的數(shù)據(jù)進行關聯(lián),這是關系型數(shù)據(jù)庫最擅長的事情。
MongoDB 成功應用場景(舉例如下)
- MongoDB在58同城百億量級數(shù)據(jù)下的應用實踐
- Telefonica(西班牙電信公司) 如何使用MongoDB 幫助數(shù)字化業(yè)務高速增長。
- eHarmony使用MongoDB技術將匹配算法縮短到95%
- SAP SAP Lumira
參考文檔:
https://www.mongodb.com/use-cases
https://docs.mongodb.com/?_ga=2.2211824.1331207551.1498467881-1886999231.1498467881
http://www.infoq.com/cn/articles/app-practice-of-mongodb-in-58-ten-billion-scale-data
結論
通過以上的對比分析,我們在MySql 和 MongoDB中選擇適合我們的數(shù)據(jù)庫。
| 數(shù)據(jù)庫類型 | 是否收費 | 集群搭建 | 數(shù)據(jù)存儲 | 業(yè)務關聯(lián) | 是否支持事務 |
|---|---|---|---|---|---|
| MySql | 免費開源 | 免費開源搭建集群非常困難,MySql集群收費 | 以行、列形式存儲 | 支持多表關聯(lián) | 支持事務 |
| MongoDB | 免費開源 | 集群搭建非常容易,并自持自動分片 | 以類似于JSON的形式存儲,非常適合web開發(fā) | 不支持表關聯(lián) | 不支持事務 |
業(yè)務場景數(shù)據(jù)
- redis 中的緩存數(shù)據(jù),key-value,轉換成 json格式的文本非常容易。因此選擇MongoDB
- redis 中緩存的用戶消息,是 非事務型數(shù)據(jù)。因此選擇 MongoDB
- redis 中的數(shù)據(jù)本身是NoSql ,因此也 不支持關聯(lián)查詢。因此 選擇 MongoDB
- 由于要持久化redis中的用戶消息數(shù)據(jù),數(shù)據(jù)量比較大,寫頻繁。因為 MongoDB的底層實現(xiàn)采用內(nèi)存映射機制,因此非常適合大并發(fā)量的寫。
- 由于用戶的消息量非常大,因此要很方便的支持水平擴展。MongoDB的對水平擴展的支持非常好,并且支持自動分片。因此選擇MongoDB


浙公網(wǎng)安備 33010602011771號