• 1. Redis|memcache|MongoDB 非专业讲解对比候利芳
  • 2. 基本概念原理对比---关键字MemcacheMongoDBredis分布式的内存对象缓存系统 hash表 Memcache memcached 分布式文件存储 C++语言 BSON C语言 分布式内存数据库 数据的持久化 master-slave模式
  • 3. memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负担。它通过在内存中缓存数据和对象,来减少读取数据库的次数。从而提高动态、数据库驱动网站速度。 memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。memcache主要用于分担数据库负的压力,memcache将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。 memcache是这个项目的名称,而memcached是它服务器端的主程序文件名。 memcache可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,memcached自管理这些HashTable。 使用memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台memcache的内存容量的有限的。 memcache采用了C/S的模式,在server端启动服务进程,在启动时可以指定监听的ip、自己的端口号,所使用的内存大小等几个关键参数。 memcached 的目前版本是通过C实现,采用了单进程、单线程、异步I/O,基于事件(event_based)的服务方式.使用libevent 作为事件通知实现。  基本概念原理对比--- Memcache
  • 4. MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 基本概念原理对比--- MongoDB
  • 5. 用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行 并支持持久化的NoSQL数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: 1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 3、Redis支持数据的备份,即master-slave模式的数据备份。 内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务 基本概念原理对比--- Redis
  • 6. 数据类型对比MemcacheMongoDBredisMapping of keys to values 维护一个统一的巨大的 hash表,它能够用来存储 各种格式的数据 BSON documentsstring(字符串) hash(哈希,类似java里的Map) list(列表) set(集合) zset(sorted set:有序集合)
  • 7. 文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。数据类型对比-- MongoDB
  • 8. 存储相关对比MemcacheMongoDBredis 内存的存储算法 持久化 RDB AOFBSON
  • 9.  Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。 slab的预分配的大少默认是1MB,可以设置开始默认大少。在启动时,可以设置内存组之间的大少差异,默认是1.25.   传统的内存管理方式是,使用完通过malloc(动态内存分配)分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。存储相关对比--memcached的内存算法
  • 10. 存储相关对比--memcached的内存算法
  • 11. 懒惰检测对象过期机制和懒惰删除对象机制 Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间, 默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种 Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对 空间是否过期,这样可减轻服务器的负载。 当删除item对象时,一般不释放内存空间,而是作标记删除,将指针放入slot回收插槽,下次分配的时候直接使用。 如果不希望系统使用LRU算法清楚数据,可以使用-M参数。 存储相关对比--Memcached缓存策略
  • 12. 存储相关对比-- redis持久化RDB数据库状态RDB文件保存为数据库状态RDB文件还原为
  • 13. 存储相关对比-- redis持久化RDB
  • 14. 存储相关对比-- redis持久化RDB
  • 15. 存储相关对比-- redis持久化AOF
  • 16. 存储相关对比-- redis持久化AOF
  • 17. 存储相关对比-- redis持久化AOF
  • 18. 存储相关对比-- redis持久化RDB和AOF对比性能小结: 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。 如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。 如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构
  • 19. 其它特点对比MemcacheMongoDBredis 分布式算法 Master/Slave主从复制 副本集 分片
  • 20. 当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。其它特点对比-Memcached分布式算法
  • 21. Consistent Hashing:选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。 余数算法:   先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。 散列算法:    先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映 射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务 器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。其它特点对比-Memcached分布式算法
  • 22. memcached不互相通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎么进行分布呢?这完全取决于客户端 实现。其它特点对比-Memcached分布式
  • 23. 其它特点对比-MongoDB 主从复制
  • 24. 副本集就是有自动故障恢复功能的主从集群。主从集群和副本集最为明显的区别就是副本集没有固定的主节点:整个集群会选举出一个主节点,当其不能工作时,则变更到其它节点。副本集总会有一个活跃节点和一个或多个备份节点。其它特点对比-MongoDB 副本集
  • 25. Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障 Config Server:mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。 Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。 其它特点对比-MongoDB分片
  • 26. 其它特点对比-Redis的集群集群的作用: 1: 主从备份 防止主机宕机 2: 读写分离,分担master的任务 3: 任务分离,如从服分别分担备份工作与计算工作
  • 27. 其它特点对比-Redis的集群(Master/Slave)
  • 28. 其它特点对比-Redis的集群redis集群: 从库配置:slaveof 主库IP 主库端口 每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件 1、一主二仆 2、薪火相传 3、反客为主:使当前数据库停止与其他数据库的同步,转成主数据库(SLAVEOF no one)
  • 29. 其它特点对比-Redis的集群通信sync: 缺陷: 每次salave断开后,(无论是主动断开,还是网络故障),再连接master 都要master全部dump出来rdb,再aof,即同步的过程都要重新执行1遍. 所以要记住---多台slave不要一下都启动起来,否则master可能IO剧增
  • 30. 其它特点对比-Redis的集群通信psync: Psync的调用方法有两种: 1、如果从服务器以前没有复制过任何主服务器,或者之前执行过SLAVEOF no one命令,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC ? -1命令,主动请求主服务器进行完整重同步。 2、相反地,如果从服务器已经复制过某个主服务器,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC 命令, runid是上一次复制的主服务器的运行ID, offset是从服务器的复制偏移量,接受这个命令的主服务器会根据这两个参数判断应该对从服务器执行哪种同步操作。
  • 31. 其它特点对比-Redis的集群哨兵模式
  • 32. bye?如有问题,请先写入下框
  • 33. memcache操作流程 1、检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作,路径操作为①②③⑦。   2、如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现),路径操作为①②④⑤⑦⑥。   3、每次更新数据库的同时更新memcached中的数据,保证一致性。   4、当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
  • 34. memcache使用场景(1) 访问频繁的字典数据 (2) 大量的hot数据 (3) 页面缓存 (4) 频繁的查询条件和结果 (5) 临时处理的数据
  • 35. memcache采用了C/S的模式,在server端启动服务进程,在启动时可以指定监听的ip、自己的端口号,所使用的内存大小等几个关键参数。 memcached 的目前版本是通过C实现,采用了单进程、单线程、异步I/O,基于事件(event_based)的服务方式.使用libevent 作为事件通知实现。多个Server可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个Server只是对自己的数据进行管理。 Client端通过指定Server端的ip地址(通过域名应该也可以)。需要缓存的对象或数据是以key->value对的形式保存在 Server端。key的值通过hash进行转换,根据hash值把value传递到对应的具体的某个Server上。当需要获取对象数据时,也根据 key进行。首先对key进行hash,通过获得的值可以确定它被保存在了哪台Server上,然后再向该Server发出请求。Client端只需要知 道保存hash(key)的值在哪台服务器上就可以了。 为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,因此,重启memcached、 重启操作系统就会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。基本概念原理对比--- Memcache