`
wbj0110
  • 浏览: 1610519 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

mongodb和redis设计原理简析

阅读更多

redis:

 
1、NIO通信
    因都在内存操作,所以逻辑的操作非常快,减少了CPU的切换开销,所以为单线程的模式(逻辑处理线程和主线程是一个)。
    reactor模式,实现自己的多路复用NIO机制(epoll,select,kqueue等)
   单线程处理多任务
 
2、数据结构
   hash+bucket结构,当链表的长度过长时,会采取迁移的措施(扩展原来两倍的hash表,把数据迁移过去,expand+rehash)
 
3、存储
全量持久化(遍历redisDB,读取bucket中的key,value),save命令阻塞主线程,bgsave开启子进程进行snapshot持久化操作,生成rdb文件。
           在shutdown时,会调用save操作
          数据发生变化,在多少秒内触发一次bgsave
           sync,master接受slave发出来的命令
 
增量持久化(aof),先写到日志buffer,再flush到日志文件中(flush的策略可以配置的,而已单条,也可以批量),
       只有flush到文件上的,才真正返回客户端。
        要定时对aof文件和rdb文件做合并操作(在快照过程中,变化的数据先写到aof buf中,等子进程完成快照<内存snapshot>后,再进行合并aofbuf变化的部分以及全镜像数据)。
 
mongodb:
1、通信
 
 多线程方式,主线程监听新的连接,连接后,启动新的线程做数据的操作(IO切换),dispatch和io操作分析
以下是相关的线程

– interruptThread---只处理信号量。

– DataFileSync::run(后台)---调用MemoryMappedFile::flush方法将内存中的数据(脏页)刷到磁盘上。 我们知道,mongodb是调用mmap把磁盘中的数据映射到内存中的,所以必须有一个机制时刻的刷数据到硬盘才能保证可靠性,多久刷一次是与syncdelay参数相关的。

– FileAllocator::run---用于分配新文件,它决定分配文件的大小,例如用翻倍的方式。

– durThread--做批量提交和回滚工作。

– SnapshotThread::run---将生成快照文件帮助快速恢复

– ClientCursorMonitor::run---将管理用户的游标,每4秒调用一次idleTimeReport()方法,每一分钟调用sayMemoryStatus()方法

– PeriodicTask::Runner::run---将从动态数组std::vector<PeriodicTask* > _tasks中获取周期性任务执行

– TTLMonitor::run---理TTL,通过调用doTTLForDB()方法检查所有db。

– replSlaveThread---是当前结点作为secondary时的同步线程

– replMasterThread---是当前结点作为master时的同步线程。

– webServerThread

– 处理数据库请求的主线程

 

2、数据结构
 
数据库-->collection-->record
 

每一个数据库都有自己独立的文件。如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里。

数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据。在MongoDB中,名字空间用于区分不同的存储类别。比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间。

在一个块中,会保存多条记录,每条记录是BSON格式的,记录与记录之间通过双向链表进行连接。

索引数据也存在数据文件中,不过索引是被组织成B Tree结构,而不是双向链表。

对每个数据库,有一个命名空间文件,用于保存每个名字空间对应的元数据。我们通过查询这些元数据来找到对应的名字空间的存储块位置。

如果你开启了jorunaling日志,那么还会有一些文件存储着你所有的操作记录

 

3、存储
 
MMap方式把文件地址映射到内存的地址空间,直接操作内存地址空间就可以操作文件,不用再调用write,read操作。

– DataFileSync::run(后台)---调用MemoryMappedFile::flush方法将内存中的数据(脏页)刷到磁盘上。 我们知道,mongodb是调用mmap把磁盘中的数据映射到内存中的,所以必须有一个机制时刻的刷数据到硬盘才能保证可靠性,多久刷一次是与syncdelay参数相关的。

journal(进行恢复用)是Mongodb中的redo log,而Oplog则是负责复制的binlog(对应Mysql)。

 

如果打开journal,那么即使断电也只会丢失100ms的数据,这对大多数应用来说都可以容忍了。从1.9.2+

,mongodb都会默认打开journal功能,以确保数据安全。而且journal的刷新时间是可以改变的,2-300ms的

范围,使用 --journalCommitInterval 命令。

Oplog和数据刷新到磁盘的时间是60s,对于复制来说,不用等到oplog刷新磁盘,在内存中就可以直接复

制到Sencondary节点。

 
 
分享到:
评论

相关推荐

    mongodb和redis数据库文档

    学习千锋教育的mongodb和redis数据库教程文档资料,你可以深入理解这两种数据库的原理、操作和最佳实践。通过这些文档,你将掌握如何安装配置数据库,如何进行数据操作,如何设计合适的数据库架构,以及如何优化性能...

    左手MongoDB,右手Redis.zip

    MongoDB和Redis是两种非常流行的NoSQL数据库,它们在现代数据存储和处理中扮演着重要角色。本资料包“左手MongoDB,右手Redis.zip”包含了关于这两种数据库的深入理解和实践指导,主要通过PDF文档的形式呈现。 ...

    SpingMVC+MongoDB+Redis 初步架构设计

    在构建一个基于SpringMVC、MongoDB和Redis的初步架构设计时,我们需要深入了解这三大技术以及它们如何协同工作。SpringMVC是Spring框架的一部分,主要用于处理Web应用的模型-视图-控制器(MVC)结构。MongoDB是一个...

    mongodb+redis资源

    通过实际操作和实践,可以深入理解这两个数据库的工作原理,学习如何优化查询性能,如何设计高可用和可扩展的数据库架构,以及如何在具体项目中有效地整合这两个数据库。同时,这些资源也可能包含一些最佳实践和常见...

    mysql+mongodb+redis.rar

    本压缩包“mysql+mongodb+redis.rar”包含了三个主流的数据库系统:MySQL、MongoDB和Redis,它们各自有着独特的特性和用途。以下是对这三个数据库系统的详细介绍: 1. **MySQL**: MySQL是一款开源、免费的关系型...

    spring 使用MongoDB/redis

    spring 使用MongoDB/redis使用示例,简单易懂

    NoSQL数据库-MongoDB和Redis

    ### NoSQL数据库-MongoDB和Redis #### 一、NoSQL简述 NoSQL数据库的出现是为了应对传统关系型数据库无法解决的一些问题,特别是在大规模数据处理方面。CAP理论(Consistency,Availability,Partition Tolerance)...

    微信小程序-小商城后台(基于Node.js、MongoDB、Redis开发的系统...).zip

    m-mall-admin后台管理界面演示用户名/密码admin/123456项目说明基于Node.js、MongoDB、Redis开发的系统基于Express提供RESTful API基于apidoc提供接口文档基于Angular.js、Ionic、Webpack部署基础基于 ECMAScript 6 ...

    Discord Clone 使用 React、ReactQuery、Tailwindcss、Redux、Socket IO、NodeJS、Express、MongoDB 和 Redis .zip

    Discord Clone 使用 React、ReactQuery、Tailwindcss、Redux、Socket IO、NodeJS、Express、MongoDB 和 Redis。Discord Clone 使用 React、ReactQuery、Tailwindcss、Redux、Socket IO、NodeJS、Express、MongoDB 和...

    Node.js-前端vue后端nodejskoa2搭配mongodb和redis

    这个平台的前端采用了Vue.js框架,后端使用了Node.js与Koa2,数据库部分则选择了MongoDB和Redis。接下来,我们将详细探讨这些技术及其在项目中的应用。 首先,Vue.js是一个轻量级、高性能的JavaScript框架,用于...

    基于sanic异步io框架的Python后端服务封装mongodb和redis设计源码

    结果:本项目为基于sanic异步IO框架设计的Python后端服务源码,包含51个文件,其中包括45个Python源代码文件、2个文本描述文件、1个Git忽略规则...该服务封装了mongodb和redis功能,旨在加速后端Python服务的开发过程。

    使用 Koa + MongoDB + Redis 搭建论坛系统【100012617】

    在本项目中,我们利用Koa作为Web应用框架,MongoDB作为主要的数据存储,Redis...通过这个项目,学生不仅可以掌握Koa、MongoDB和Redis的基本用法,还能了解到如何将它们整合到一个实际的应用中,从而提升Web开发技能。

    dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb-redis, dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb-redis整合.zip

    dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb-redis, dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb-redis整合

    基于mongodb数据库的集成redis缓存springboot实战

    这通常通过在`pom.xml`文件中引入Maven依赖来完成,例如MongoDB的`spring-boot-starter-data-mongodb`和Redis的`spring-boot-starter-data-redis`。 MongoDB的集成涉及创建MongoDB的配置类,设置数据库连接信息,如...

    springboot整合mongodb+redis+mybatis+mysql

    本示例项目整合了多种数据库技术,包括 MongoDB、Redis 和 MyBatis,同时使用 MySQL 作为传统的关系型数据库。 MongoDB 是一个基于分布式文件存储的非关系型数据库,适用于处理大量数据的场景,尤其适合文档型数据...

    php-mongodb-redis手册

    在实践中,理解数据模型的概念(如文档、集合和数据库)以及如何有效地利用这些概念来设计数据结构至关重要。 其次,Redis作为一个高性能的键值存储系统,广泛用于缓存、消息队列和实时数据分析等领域。PHP与Redis...

    使用springboot,mongodb,redis搭建的高性能restfulAPI项目,开发快速

    在本项目中,我们主要利用Spring Boot、MongoDB和Redis三个关键组件来构建一个高性能的RESTful API服务。下面将详细解析这些技术及其在项目中的应用。 **Spring Boot** Spring Boot是Spring框架的一个子项目,旨在...

    Node.js-一个node.jsHapi服务器使用MongoDB和Redis在本地和OpenShift上运行

    一个node.js Hapi服务器,使用MongoDB和Redis在本地和OpenShift上运行

    mysql, mongodb, redis基本使用方法

    mysql, mongodb, redis三大数据库的基本是用命令, 以及举例

Global site tag (gtag.js) - Google Analytics