针对缓存在Redis中的聊天消息的持久化方案分析
选型依据
数据库的选型主要考虑一下几个方面:
- 数据库本身是否收费
- 数据库后期维护成本
- 是否支持水平及垂直扩展,及扩展的容易程度
- 业务数据本身特性
- 使用此数据库的开发成本
由于此数据库主要用来存储缓存在redis中的用户发送的消息,对用户发送的消息进行持久化,主要用作以后的分析与查找,本身业务价值不大。redis数据的存储方式为 key-value。本来通过对常用的关系型数据库与非关系型数据库进行对比分析,选择适合本业务需求的最佳数据库。
关系型数据库
对关系型数据库的分析主要分析SqlServer 、Oracle、MySql
Sql Server
SQLServer只能在windows上运行,所以不做考虑。
Oracle
优点
- 引入了共享SQL和多线索服务器体系结构。这减少了ORACLE的资源占用,并增强了ORACLE的能力,使之在低档软硬件平台上用较少的资源就可以支持更多的用户
- 提供了基于角色(ROLE)分工的安全保密管理。在数据库管理功能、完整性检查、安全性、一致性方面都有良好的表现。
- 支持大量多媒体数据,如二进制图形、声音、动画以及多维数据结构等。
- 提供了新的分布式数据库能力。可通过网络较方便地读写远端数据库里的数据,并有对称复制的技术。
缺点
- 费用较高
- 管理维护成本高
- 对硬件的要求很高
- 对管理员经验、经验要求很高
- 数据库崩溃后恢复比较困难
MySql
优点
- Mysql是免费开源的
- Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
- MySQL不仅能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能作为一个库而嵌入到其他的软件中
- 支持多线程,使CPU资源得到充分利用
- 支持特大型的数据库。
- 使用C和C++编程语言编写,且可以使用多种编译器进行测试,保证源代码的可移植性,安装简单小巧
- 提供用于管理、检查、优化数据库操作的管理工具
缺点
- MySQL在稳定性和集群方面存在一些问题。除非使用收费版本
- 完全免费的MySQL安装集群式非常困难的。
- 当表数据非常大时,修改表数据结构会锁定整个表结构
非关系型数据库
由于chat的业务需求为持久化缓存在resis中的用户交互信息。因此详细介绍面向文档的数据库 MongoDB,MongoDB中的文档类似于JSON对象。
什么是MongoDB
MongoDB是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构有键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。
MongoDB的功能
- MongoDB可以实现范围查询、数据集包含查询、不等式查询,以及其他一些查询。
- 可以通过MongoDB对数据进行分析并加以利用,MongoDB提供的聚合工具有:聚合框架、MapReduce、及几个简单的聚合命令:count、distinct和group
- 副本集 (将数据副本保存到多台服务器上)
- 自动分片(类似于关系型数据库的分表)
- MongoDB除支持MySQL的常用索引外,还支持TTL索引
- 自动清除:MongoDB还提供了受限集合,当受限集合到达上限时,旧文档会被自动清除。如果想让基于时间而不是整个集合的大小,可以用TTL索引
- 内置GridFS ,支持大容量存储(GridFS是一个出色的分布式文件系统,可以支持海量的数据存储)
MongoDB 的优势
- 写入高性能:存储引擎使用的内存映射文件(MMAP的方式),将内存管理工作交给操作系统去处理。MMAP的机制,数据的操作写内存即是写磁盘,在保证数据一致性的前提下,提供了较高的性能。
- 易于扩展:MongoDB支持自动分片(分片就是讲数据拆分,将其分散存放在不同机器上的过程)。MongoDB自动处理数据在分片上的分布,也更容易添加和删除分片。
- 对非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景
- 无模式(不像关系型数据库,先定义表结构)
不适合使用MongoDB的场景
- MongoDB不支持事务,对事务性有要求的应用程序不建议使用MongoDB
- 在多个不同纬度上对不同类型的数据进行关联,这是关系型数据库最擅长的事情。
MongoDB 成功应用场景(举例如下)
- MongoDB在58同城百亿量级数据下的应用实践
- Telefonica(西班牙电信公司) 如何使用MongoDB 帮助数字化业务高速增长。
- 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中选择适合我们的数据库。
数据库类型 | 是否收费 | 集群搭建 | 数据存储 | 业务关联 | 是否支持事务 |
---|---|---|---|---|---|
MySql | 免费开源 | 免费开源搭建集群非常困难,MySql集群收费 | 以行、列形式存储 | 支持多表关联 | 支持事务 |
MongoDB | 免费开源 | 集群搭建非常容易,并自持自动分片 | 以类似于JSON的形式存储,非常适合web开发 | 不支持表关联 | 不支持事务 |
业务场景数据
- redis 中的缓存数据,key-value,转换成 json格式的文本非常容易。因此选择MongoDB
- redis 中缓存的用户消息,是 非事务型数据。因此选择 MongoDB
- redis 中的数据本身是NoSql ,因此也 不支持关联查询。因此 选择 MongoDB
- 由于要持久化redis中的用户消息数据,数据量比较大,写频繁。因为 MongoDB的底层实现采用内存映射机制,因此非常适合大并发量的写。
- 由于用户的消息量非常大,因此要很方便的支持水平扩展。MongoDB的对水平扩展的支持非常好,并且支持自动分片。因此选择MongoDB
通过以上分析:选择MongoDB作为chat消息的持久化
针对缓存在Redis中的聊天消息的持久化方案分析的更多相关文章
- [python]mysql数据缓存到redis中 取出时候编码问题
描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...
- 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】
在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...
- Redis 中常见的集群部署方案
Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...
- 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】
加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...
- Redis中的Java分布式缓存
为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...
- Redis中删除过期Key的三种策略
转载自:http://blog.csdn.net/a_bang/article/details/52986935?locationNum=9&fps=1 项目中有个接口要频繁调用查询数据库中的 ...
- Lua在Redis中的应用
转载至笑松小站http://blog.seoui.com/2018/01/27/redis-lua/ redis从2.6版本开始内置支持Lua解释器,解释器提供了3个函数来处理redis的命令redi ...
- 融云技术分享:解密融云IM产品的聊天消息ID生成策略
本文来自融云技术团队原创分享,原文发布于“融云全球互联网通信云”公众号,原题<如何实现分布式场景下唯一 ID 生成?>,即时通讯网收录时有部分改动. 1.引言 对于IM应用来说,消息ID( ...
- Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131
最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...
随机推荐
- Microsoft Deployment Toolkit build 8456
MDT build 8456的重大变化摘要. 支持的配置更新 Windows ADK for Windows 10,版本1809 Windows 10,版本1809 Configuration Man ...
- File operations 1
1:只读(‘r' 和 ’rb'以字节读) f = open('d:\模特主妇护士班主任.txt',mode='r',encoding='UTF-8') content = f.read() print ...
- drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)
最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...
- 仿EXCEL插件,智表ZCELL产品V1.5 版本发布,IE8/9完全兼容
详细请移步 智表(ZCELL)官网www.zcell.net 更新说明 这次更新主要应用户要求,主要解决了IE8/9等低版本浏览器兼容的问题,新增了部分功能,欢迎大家体验使用. 本次版本更新内容如下 ...
- Hexo server报错TypeError: Cannot read property 'utcOffset' of null解决方法
最近刚刚开始使用Hexo,新建了一篇article,运行hexo server时候总是报错Cannot read property 'offset' of null. 最后发现是因为手贱把_confi ...
- MacOS 的预览 Preview 打开pdf 容易卡死 解决方案
MacOs 10.13.6 打开pdf之后容易卡死. 移动一下窗口之后就卡死了. 有时候等一会还能缓过来,有时候就缓不过来了. 只要执行下这个命令就可以了. sudo rm -rf ~/Library ...
- zabbix目录
1.Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述 2.Linux实战教学笔记50:Zabbix监控平台3.2.4(二)深入理解zabbix 3.Linux实战教学笔记 ...
- [认证授权] 5.OIDC(OpenId Connect)身份认证(扩展部分)
在上一篇[认证授权] 4.OIDC(OpenId Connect)身份认证(核心部分)中解释了OIDC的核心部分的功能,即OIDC如何提供id token来用于认证.由于OIDC是一个协议族,如果只是 ...
- 关于Math.round()方法
先上结论: 1.参数的小数点后第一位<5,运算结果为参数整数部分. 2.参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(+ or -)不变. 3.参数的小数点后第一位=5 ...
- MediaManager配置公网访问功能
安装时设置传输本地地址及端口,如图: 路由器设置端口映射,如下图 使用时,打开公网地址http://IpAddress:8090/ContentManager/MainPage.aspx?zh-CN# ...