Redis vs MongoDB
通常情况下,应用系统的技术选型,对于如何选择非关系型数据库,是一个不小的挑战。这不仅考验架构师在技术上的广度和深度,同时也考究对业务细节了解和熟悉程度。只有将业务场景、业务特点、数据特征跟具体的技术特性相结合,才能开发出满足业务需要应用程序,最终实现快速落地的目的。
对于NO-SQL数据库而言,目前比较流行、常用的有Redis、Mongodb、ES、Hbase。 今天来对Redis、Mongodb之间做一个简单的对比,主要包含它们之间的特性,已经应用场景,特此记录。
Redis
Redis是一个内存数据结构存储,提供了丰富的功能。通常应用于数据缓存、消息代理、队列、排名、秒杀等业务场景。
特性
- 专门的命令行交互界面 – redis-cli
- 键值对的数据存取方式,支持丰富的数据结构 如 list, set, hash, stream, bitmap 等
- 最大支持512M的数据存储
- 支持发布/订阅消息队列
- 支持管理实时地理空间数据的特殊命令提供地理空间支持 - Geospatial data type
- 支持LUA脚本
- 提供多语言客户端连接工具 如Java、golang、Python
- 支持物联网和嵌入式设备
- 支持Spring Data
- 支持Spring Cache 例如Java 客户端Redisson
安装
针对不同的系统Redis提供不同的安装方式。该文章只介绍采用源码的安装方式,在Mac OS10.13.6、Centos7.8两个系统都成功安装
-
下载源码包
wget https://download.redis.io/redis-stable.tar.gz
-
解压源代码包
tar -xzvf redis-stable.tar.gz cd redis-stable make
如果安装成功后,会在src目录下生成可执行文件
- redis-server - redis-server 可执行文件
- redis-cli - redis客户端命令工具
-
如需要将相关工具安装在**/usr/local/bin**,请执行
make install
-
启动 - 当执行完 make install 命令后,可以在命令行终端的任意目录使用以下命令启动Redis服务
redis-server
如上图,Redis已经成功启动,从启动日志可以看出Redis的版本信息。
MongoDB
MongoDB是一个NoSQL文档数据库,它以类似JSON的文档结构 (BSON)存储信息。它作为一个无模式数据存储非常有用,可用于设计和实现阶段快速变化的应用程序、原型。
特性
- 供交互式命令行界面MongoDB Shell(mongosh)执行管理操作和查询/更新数据
- 支持基于JSON结构的JOIN查询方式
- 支持不同数据类型的数据检索,如基于地理的搜索、图形搜索和文本搜索
- 支持多文档ACID事务
- 支持Spring Data
- 不同的版本供开发者选择 如社区、企业和云(MongoDB Atlas)版本
- 多语言驱动程序 如C++, Java, Go, Python, Rust, and Scala
- 提供MongoDB Compass GUI工具浏览和操作数据
- 使用MongoDB图表提供数据的可视化表示
- MongoDB BI连接器提供与BI和分析平台的连接
安装
Redis 应用场景
缓存
- 毫秒级响应 - Redis对频繁的客户端情况请求,提供毫秒级时间响应 性能极佳
- 数据过期 - 使用EXPIRE、EXPIREAT和PEXPIRE等命令设置密钥的过期时间
- 数据持久化 - 使用PERSIST命令并持久化键值对,使其成为缓存的理想选择
灵活数据存储
Redis提供各种数据结构,如字符串、列表、集合和哈希,以决定如何存储和组织数据。因此,Redis为我们提供了实现数据库结构的完全自由
复杂数据存储
同样地,通过列表、集合和散列的组合,开发者可以为存储实现复杂的数据结构,如队列、数组、排序集和图
Chat, Queue, Message Broker
Redis支持使用模式匹配的方式对数据进行发布、订阅处理。因此,Redis可以支持实时聊天和社交媒体订阅应用程序。类似地,我们可以使用列表数据结构实现轻量级队列。此外,Redis的列表支持原子操作并提供阻塞功能,因此适合实现消息代理。
注意:Redis 5.0之前的版本 发布订阅功能并不完美,对于数据在处理过程中不支持数据持久化、集群消费、广播消费等功能。Redis 5.0之后引入了Redis Streams功能,对一些方面进行了改进,但仍然跟RocketMQ、Kafka有很大的区别
会话存储
Redis提供了一个具有持久性功能的内存数据存储,使其成为存储和管理web/移动应用程序会话的理想选择。使用Redis集中式的对session会话进行存储,解决了分布式应用系统中的会话管理问题
IOT & 嵌入式系统
根据Redis的官方文档,从4和5开始的更新版本支持ARM处理器和树莓派。此外,它在Andriod上运行,并且正在努力将Android作为官方支持的平台。因此,Redis看起来非常适合物联网和嵌入式系统,得益于其小内存占用和低CPU需求。
实时处理
作为一种存储速度极快的数据结构,我们可以将其用于实时处理应用程序。例如,Redis可以有效地服务于提供股价警报、排行榜和实时分析等功能的应用程序。
地理位置服务
Redis提供了专门构建在内存中的数据结构Geo Set(基于排序集),用于管理地理空间索引。此外,它还提供特定的地理命令,如GEOADD、GEOPOS和GEORADIUS,以添加、读取和分析地理空间数据。因此,开发者可以使用Redis构建具有基于位置的功能的实时地理空间应用程序,如微信附近的人。
MongoDB 应用场景
动态查询
MongoDB提供强大的查询功能,支持灵活、复杂的查询场景,如基于地理的搜索、图形搜索和文本搜索,以实现高效的数据检索。同时,在JSON结构化查询的支持下,MongoDB似乎是数据搜索和分析是日常活动的场景的更好选择。
快速架构调整
项目开发初期,由于业务模式不清晰、业务试错等场景。 MongoDB在设计和早期实现阶段非常有用,因为无规则的数据结构,允许开发人员进行快速的产品迭代。它不会对系统底层数据进行固化,支持在产品迭代过程中进行自我优化。
原型制作
通过遵循类似JSON的文档结构,MongoDB允许快速原型、与前端通道的快速集成。同时,它对于不想处理RDBMS复杂性的初级团队也很有用。
动态目录
通过提供一个自我描述的动态模式,MongoDB可以更容易地为电子商务、资产管理和库存等目录添加产品、功能和建议。我们还可以通过索引JSON结构化文档的一个字段或一组字段,在MongoDB中使用表达式查询来实现高级搜索和分析等功能。
移动应用
MongoDB的JSON文档结构允许存储来自各种设备的不同类型的数据以及地理空间索引。此外,数据的水平可扩展性允许移动应用程序的轻松扩展。因此,MongoDB可以为千万级别的用户提供服务,处理数PB的数据,每秒支持数十万次操作,是支持移动应用程序的理想选择。
富应用程序
在RDBMS中为现代内容丰富的应用程序合并各种内容并不容易。另一方面,MongoDB允许存储和提供文本、音频和视频等丰富内容。此外,我们可以使用MongoDB GridFS轻松高效地存储大于16MB的文件。它允许访问大文件的一部分,而无需将整个文件加载到内存中。此外,它还自动在所有服务器上同步我们的文件和元数据。因此,MongoDB看起来更适合支持内容丰富的应用程序。
游戏
与移动和内容丰富的应用程序类似,游戏也需要大规模扩展和动态数据结构。因此,MongoDB可能是游戏应用的一个有前途的选择。
云数据服务
MongoDB Atlas可用于AWS、Google cloud和Azure等多种云服务。此外,通过内置的复制和故障切换机制,它提供了一个高度可用的分布式系统。因此,开发者可以快速部署和管理数据库,并将其用作全球云数据库服务。
总结
综上所述,MongoDB由于其无结构化的文档存储模式,能够适应各种复杂的业务场景,同时Mongodb支持各种灵活、复杂的数据查询和数据统计。Redis由于其内存存储的特性,性能高、系统吞吐量大,响应时间快,偏向于处理各种性能要求比较高的业务场景。