1. 程式人生 > >針對緩存在Redis中的聊天消息的持久化方案分析

針對緩存在Redis中的聊天消息的持久化方案分析

消息 網絡 定制 源搭建 裏的 mysql body png mongo

選型依據

數據庫的選型主要考慮一下幾個方面:

  • 數據庫本身是否收費
  • 數據庫後期維護成本
  • 是否支持水平及垂直擴展,及擴展的容易程度
  • 業務數據本身特性
  • 使用此數據庫的開發成本

由於此數據庫主要用來存儲緩存在redis中的用戶發送的消息,對用戶發送的消息進行持久化,主要用作以後的分析與查找,本身業務價值不大。redis數據的存儲方式為 key-value。本來通過對常用的關系型數據庫與非關系型數據庫進行對比分析,選擇適合本業務需求的最佳數據庫。

關系型數據庫

對關系型數據庫的分析主要分析SqlServer 、Oracle、MySql

Sql Server

SQLServer只能在windows上運行,所以不做考慮。

Oracle

優點

  1. 引入了共享SQL和多線索服務器體系結構。這減少了ORACLE的資源占用,並增強了ORACLE的能力,使之在低檔軟硬件平臺上用較少的資源就可以支持更多的用戶
  2. 提供了基於角色(ROLE)分工的安全保密管理。在數據庫管理功能、完整性檢查、安全性、一致性方面都有良好的表現。
  3. 支持大量多媒體數據,如二進制圖形、聲音、動畫以及多維數據結構等。
  4. 提供了新的分布式數據庫能力。可通過網絡較方便地讀寫遠端數據庫裏的數據,並有對稱復制的技術。

缺點

  1. 費用較高
  2. 管理維護成本高
  3. 對硬件的要求很高
  4. 對管理員經驗、經驗要求很高
  5. 數據庫崩潰後恢復比較困難

MySql

優點

  1. Mysql是免費開源的
  2. Mysql是可以定制的,采用了GPL協議,你可以修改源碼來開發自己的Mysql系統
  3. MySQL不僅能夠作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也能作為一個庫而嵌入到其他的軟件中
  4. 支持多線程,使CPU資源得到充分利用
  5. 支持特大型的數據庫。
  6. 使用C和C++編程語言編寫,且可以使用多種編譯器進行測試,保證源代碼的可移植性,安裝簡單小巧
  7. 提供用於管理、檢查、優化數據庫操作的管理工具

缺點

  1. MySQL在穩定性和集群方面存在一些問題。除非使用收費版本
    技術分享圖片
  2. 完全免費的MySQL安裝集群式非常困難的。
  3. 當表數據非常大時,修改表數據結構會鎖定整個表結構

非關系型數據庫

由於chat的業務需求為持久化緩存在resis中的用戶交互信息。因此詳細介紹面向文檔的數據庫 MongoDB,MongoDB中的文檔類似於JSON對象。

什麽是MongoDB

MongoDB是一個基於分布式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。MongoDB旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB將數據存儲為一個文檔,數據結構有鍵值(key=>value)對組成。MongoDB文檔類似於JSON對象。字段值可以包含其他文檔,數組及文檔數組。
技術分享圖片

MongoDB的功能

  1. MongoDB可以實現範圍查詢、數據集包含查詢、不等式查詢,以及其他一些查詢。
  2. 可以通過MongoDB對數據進行分析並加以利用,MongoDB提供的聚合工具有:聚合框架、MapReduce、及幾個簡單的聚合命令:count、distinct和group
  3. 副本集 (將數據副本保存到多臺服務器上)
  4. 自動分片(類似於關系型數據庫的分表)
  5. MongoDB除支持MySQL的常用索引外,還支持TTL索引
  6. 自動清除:MongoDB還提供了受限集合,當受限集合到達上限時,舊文檔會被自動清除。如果想讓基於時間而不是整個集合的大小,可以用TTL索引
  7. 內置GridFS ,支持大容量存儲(GridFS是一個出色的分布式文件系統,可以支持海量的數據存儲)

MongoDB 的優勢

  1. 寫入高性能:存儲引擎使用的內存映射文件(MMAP的方式),將內存管理工作交給操作系統去處理。MMAP的機制,數據的操作寫內存即是寫磁盤,在保證數據一致性的前提下,提供了較高的性能。
  2. 易於擴展:MongoDB支持自動分片(分片就是講數據拆分,將其分散存放在不同機器上的過程)。MongoDB自動處理數據在分片上的分布,也更容易添加和刪除分片。
  3. 對非事務安全,MongoDB很適合業務系統中有大量“低價值”數據的場景
  4. 無模式(不像關系型數據庫,先定義表結構)

不適合使用MongoDB的場景

  1. MongoDB不支持事務,對事務性有要求的應用程序不建議使用MongoDB
  2. 在多個不同緯度上對不同類型的數據進行關聯,這是關系型數據庫最擅長的事情。

MongoDB 成功應用場景(舉例如下)

  1. MongoDB在58同城百億量級數據下的應用實踐
  2. Telefonica(西班牙電信公司) 如何使用MongoDB 幫助數字化業務高速增長。
  3. eHarmony使用MongoDB技術將匹配算法縮短到95%
  4. 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中選擇適合我們的數據庫。

數據庫類型是否收費集群搭建數據存儲業務關聯是否支持事務
MySql 免費開源 免費開源搭建集群非常困難,MySql集群收費 以行、列形式存儲 支持多表關聯 支持事務
MongoDB 免費開源 集群搭建非常容易,並自持自動分片 以類似於JSON的形式存儲,非常適合web開發 不支持表關聯 不支持事務

業務場景數據

  • redis 中的緩存數據,key-value,轉換成 json格式的文本非常容易。因此選擇MongoDB
  • redis 中緩存的用戶消息,是 非事務型數據。因此選擇 MongoDB
  • redis 中的數據本身是NoSql ,因此也 不支持關聯查詢。因此 選擇 MongoDB
  • 由於要持久化redis中的用戶消息數據,數據量比較大,寫頻繁。因為 MongoDB的底層實現采用內存映射機制,因此非常適合大並發量的寫。
  • 由於用戶的消息量非常大,因此要很方便的支持水平擴展。MongoDB的對水平擴展的支持非常好,並且支持自動分片。因此選擇MongoDB

通過以上分析:選擇MongoDB作為chat消息的持久化

針對緩存在Redis中的聊天消息的持久化方案分析