最近在思考数据库以及缓存的问题,发现这些知识点其实是有一点关联的,于是这篇文章通过一个连环提问的方式将这些知识点串联起来。

  • 问:为什么要用 Memcached、Redis,直接用 MySQL 这些数据库不好吗?

答:因为 MySQL 等关系型数据库无法承受巨大的数据库访问量。

  • 问:为什么 MySQL 数据库无法承受巨大的访问量,而 Redis Memcached 却可以?

因为 MySQL 使用文件去存储数据,这就意味着它的查询和写入速度受限于硬盘的速度。虽然 MySQL 也使用了内存缓存一部分数据,但这只能减少一部分的查询请求,如果查询请求数变多,同样会到达硬盘的 IO 瓶颈。

另一方面,关系型数据库为了实现数据的强一致性,在每次写入数据的时候会对相关的数据进行加锁操作,这样就导致在某个时刻,相关的数据只能有一个线程在操作,这样也从某种程度上限制了 MySQL 的读写性能。

如果此时查询缓存并没有相关数据,那么还会有一部分 IO 等待的事件,从而导致加锁时间变长。

而 Redis、Memcached 之所以能够承受得住 MySQL 无法承受的海量查询,很大程度上是因为他们将所有数据都存在了内存中,所以它们并不需要进行 IO 等待,直接可以从内存中查询数据并返回。

而内存的读取效率则是硬盘的 40 倍左右,存储介质的巨大区别导致了他们的应用特性。

  • 问:那有了 Memcached 不就好了吗,为什么还要用 Redis 呢?

答:这就要说到这两种缓存的发展历史了。一开始是 2003 年发布的,一开始是为了解决数据库的读写瓶颈问题,于是将一些热点数据存储在内存中,从而有了 Memcached。

但经过几年的使用,人们发现 Memcached 存在一些问题,例如 Memcached 只支持 Key - Value 的字符串数据存储,Memcached 无法持久化数据,一旦重启服务器数据便丢失了。

出于这些原因,2009 年一些工程师在 Memcached 的基础之上打造了 Redis 框架,它与 Memcached 相比,支持更多的数据类型存储,例如:String, List, Set, SortedSet, Hash 等。此外还支持将存储在内存中的数据持久化到文件中,从而实现数据持久化。

另外 Redis 支持更大的数据存储,key-value 的存储大小可达 512M,而 Memcached 的 key 大小只有 512KB,而 value 则只有 1 M 大小。

另外它还支持许多的原子操作。因为 Redis 与 Memcached 相比有上述的优点,所以现在越来越多的人开始使用 Redis 作为缓存框架。

  • 问:但按我所知,现在还是有许多公司使用 Memcached 作为缓存框架。换句话说,你觉得什么时候应该使用 Memcached,什么时候应该使用 Redis?

答:首先,无论 Redis 还是 Memcached,它们都是一个 NoSQL 数据库,并且都将所有数据存在内存中。现在确实有些公司还是使用 Memcached 框架作为缓存,Memcached 在某些方面确实比 Redis 好一些,虽然这些优势非常小。

例如 Memcached 在处理小数据量静态数据的速度会非常快,但是一旦数据量变大或者数据变动频繁,那 Memcached 的处理速度就会急剧下降。

另外一个 Memcached 的优势是 Memcached 是多线程的,所以如果你想提高 Memcached的性能,你可以直接给它换一个性能更加强劲的 CPU 就可以。

但是对于 Redis 而言,因为 Redis 是单线程的,所以如果你想提升 Redis 的处理能力,那么你只能多部署一台 Redis 服务器,这比起 Memcached 来说比较麻烦。

总结来说,Memcached 比起 Redis 来说,只有小数据量存储以及横向拓展这两个方面能勉强说得上「优势」,但其实 Redis 也能做得同样好,甚至超过它,只不过是需要花多点学习成本而已。

所以,如果你之前已经非常了解 Memcached 了,花了很多时间学习 Memcached 的知识,那么你可以选择 Memcached。

否则选择 Redis 是一个更好的选择,因为所有 Memcached 能做的,Redis 也能做,而且 Redis 能做到更多 Memcached 无法做到的事情。

  • 问:那 Redis 除了作为缓存之外,还有其他什么作用吗?

答:作为缓存可能是 Redis 最广为人知的作用吧,但 Redis 除了作为缓存,还能作为消息队列解决方案、分布式锁等。

  • 问:那 MongoDb 与 Redis 相比有什么优势可言,它更适用于什么场景呢?

答:MongoDb 的出现与 Redis 的出现类似,都是用来解决 MySQL 无法实现海量访问而存在的。但 Redis 仅仅是一个 key-value 的缓存系统,其几乎没有任何数据库特性,在那些许多进行查询的场景中,redis 无法胜任。

在这个时候 MongoDb 凭借其出色和丰富的查询功能脱颖而出。

另外 MongoDb 也能存储比 MySQL 更加大量的数据。MongoDb 适合那种数据结构经常变化,数据之间没有联系,这种场景适合用 MongoDb,例如多重嵌套的留言回复。

redis、Memcached、MongoDb使用心得的更多相关文章

  1. redis memcached MongoDB

    我们现在使用的模式是,对于直接的key value对需缓存的直接用memcached.对于collection类型就使用Redis.对于大数据量的内容性的东西,我们打算尝试用mongoDB.也正在学习 ...

  2. 面试题-Redis、MongoDB、Memcached[转]

    https://blog.csdn.net/gangsijay888/article/details/81213811 一.缓存 搞懂缓存那些事:https://blog.csdn.net/a7248 ...

  3. Redis、MongoDB及Memcached的区别 Redis(内存数据库)

    Redis.MongoDB及Memcached的区别 Redis(内存数据库) 是一个key-value存储系统(布式内缓存,高性能的key-value数据库).和Memcached类似,它支持存储的 ...

  4. 面试阿里被分布式“搞懵”,Redis、MongoDB、memcached没答上来

    都说大厂面试难,一点也没有错,一线大厂的面试究竟怎么样还得自己亲身经历了才知道.小白面试阿里,就被面试官吊打,一问分布式就被“搞懵”了,Redis.MongoDB.Memcached都没答好,很多没有 ...

  5. HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  6. 基于Redis+MySQL+MongoDB存储架构应用

    摘  要: Redis+MySQL+MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求.使用MongoDB切片的水平动态添加,可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 ...

  7. Redis和MongoDB的区别(面试受用)

    项目中用的是MongoDB,但是为什么用其实当时选型的时候也没有太多考虑,只是认为数据量比较大,所以采用MongoDB. 最近又想起为什么用MongoDB,就查阅一下,汇总汇总: 之前也用过redis ...

  8. centos7.6编译安装php7.2.11及redis/memcached/rabbitmq/openssl/curl等常见扩展

    centos7.6编译安装php7..11及redis/memcached/rabbitmq/openssl/curl等常见扩展 获取Php的编译参数方法: [root@eus-api-cms-bac ...

  9. redis/memcached可视化客户端工具TreeNMS

    RedisDesktopManager 之前用的redis客户端工具还不错,今天发现一个国产的nosql客户端,还挺方便滴 TreeNMS是一款redis,Memcache可视化客户端工具,采用JAV ...

随机推荐

  1. org.springframework.data.mongodb.core.MongoTemplate]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.convert.support.ConversionServiceFactory.cr

    spring-data-mongo 和spring core包冲突.解决办法: <dependency> <groupId>org.springframework.data&l ...

  2. Android根据URL下载文件保存到SD卡

    //下载具体操作 private void download() { try { URL url = new URL(downloadUrl); //打开连接 URLConnection conn = ...

  3. java笔记--String类格式化当天日期转换符文档

    String类格式化当天日期 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877389.html "谢谢-- 转换符:% ...

  4. 【转】ISMS方针、手册、程序文件模板

    <ISMS方针.手册.程序文件模板> 1 信息安全管理手册 2 信息安全适用性声明 3 信息安全管理体系程序文件 3.01文件管理程序 3.02记录管理程序 3.03纠正措施管理程序 3. ...

  5. 设计模式(16) 观察者模式(OBSERVER)C++实现

    意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 动机: 将一个系统设计成一系列相互协作的类有一个常见的副作用:需要维护相关对象之间的一 ...

  6. NJCTF2017 web getflag(详解)

    题目: url:http://218.2.197.235:23725/ writeup: 首先随便输入后查看源码: <imgsrc="data:image/png;base64,Y2F ...

  7. CentOS 6 各种启动文件损坏及修复

    stage1 mbr的破坏和恢复 清空mbr 前446字节 dd if=/dev/zero of=/dev/sda bs=1 count=446 如果没有挂载启动光盘,会显示这样 如果启动前挂载了光盘 ...

  8. TCP/UDP调试器 SocketToolV4.1

    TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案.SocketTool V ...

  9. 关于Linq中First、FirstOrDefault;Single、SingleOrDefault等方法的说明

    关于Linq中First.FirstOrDefault:Single.SingleOrDefault等方法的说明 这里以First.FirstOrDefault进行说明,其他类似. 1.First:取 ...

  10. Shell的egrep、grep、fgrep命令的使用

    Linux egrep 命令用于在文件内查找指定的字符串.与grep-E使用语法及参数相似,不同点在于解读字符串的方法. 语法: egrep [范本模式] [文件或目录] 参数说明: [范本模式]:查 ...