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

  • 问:为什么要用 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. TCP协议 状态解析和状态统计

    一.三次握手和四次挥手 1.建立连接(三次握手)   (1)服务器会处于listen状态,客户端发送一个带SYN标志的TCP报文到服务器.   (2)服务器端回应客户端的请求,这是三次握手中的第2个报 ...

  2. xml-treeview转换

    XML——>treeciew using System; using System.Collections.Generic; using System.Text; using System.Wi ...

  3. leetcode coding base

    1. Contains Duplicate 2. Contains Duplicate II 3. Contains Duplicate III

  4. CALayer的additive属性解析

    CALayer的additive属性解析 效果: 源码:https://github.com/RylanJIN/ShareOfCoreAnimation // // CAPartAViewContro ...

  5. Effective C++(10) 重载赋值操作符时,返回该对象的引用(retrun *this)

    问题聚焦: 这个准则比较简短,但是往往就是这种细节的地方,可以提高你的代码质量. 细节决定成败,让我们一起学习这条重载赋值操作符时需要遵守的准则吧. 还是以一个例子开始: Demo // 连锁赋值 x ...

  6. Microsoft Windows XP SP3 官方原版镜像下载,绝对原版加系列号!

    转:http://blog.sina.com.cn/s/blog_638c2e010100op5z.html 写在前面:1. VOL是Volume Licensing for Organization ...

  7. August 29th 2017 Week 35th Tuesday

    Life is a pure flame, and we live by an invisible sun within us. 生命如纯洁的火焰,而维系这火焰的是我们内心的太阳. Burn my l ...

  8. GO语言 切片的缩短和增长原理

    package main import "fmt" //import OS "os" //import "strings" //import ...

  9. S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析

    题目这个增强的输入参数很恐怖,长长的一串: CALL BADI l_badi->BEFORE_UPDATE EXPORTING IT_PIINSTRUCTIONVALUE = IT_PIINST ...

  10. Java的Stream流

    yi.控制台输入输出流, 1.读取控制台输入 Java的控制台输入由System.in完成.为了获得一个绑定到控制台的字符流,可以把System.in包装在一个BufferedReader对象中来创建 ...