redis、Memcached、MongoDb使用心得
最近在思考数据库以及缓存的问题,发现这些知识点其实是有一点关联的,于是这篇文章通过一个连环提问的方式将这些知识点串联起来。
- 问:为什么要用 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使用心得的更多相关文章
- redis memcached MongoDB
我们现在使用的模式是,对于直接的key value对需缓存的直接用memcached.对于collection类型就使用Redis.对于大数据量的内容性的东西,我们打算尝试用mongoDB.也正在学习 ...
- 面试题-Redis、MongoDB、Memcached[转]
https://blog.csdn.net/gangsijay888/article/details/81213811 一.缓存 搞懂缓存那些事:https://blog.csdn.net/a7248 ...
- Redis、MongoDB及Memcached的区别 Redis(内存数据库)
Redis.MongoDB及Memcached的区别 Redis(内存数据库) 是一个key-value存储系统(布式内缓存,高性能的key-value数据库).和Memcached类似,它支持存储的 ...
- 面试阿里被分布式“搞懵”,Redis、MongoDB、memcached没答上来
都说大厂面试难,一点也没有错,一线大厂的面试究竟怎么样还得自己亲身经历了才知道.小白面试阿里,就被面试官吊打,一问分布式就被“搞懵”了,Redis.MongoDB.Memcached都没答好,很多没有 ...
- HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比
最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...
- 基于Redis+MySQL+MongoDB存储架构应用
摘 要: Redis+MySQL+MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求.使用MongoDB切片的水平动态添加,可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 ...
- Redis和MongoDB的区别(面试受用)
项目中用的是MongoDB,但是为什么用其实当时选型的时候也没有太多考虑,只是认为数据量比较大,所以采用MongoDB. 最近又想起为什么用MongoDB,就查阅一下,汇总汇总: 之前也用过redis ...
- 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 ...
- redis/memcached可视化客户端工具TreeNMS
RedisDesktopManager 之前用的redis客户端工具还不错,今天发现一个国产的nosql客户端,还挺方便滴 TreeNMS是一款redis,Memcache可视化客户端工具,采用JAV ...
随机推荐
- firewall 如何开放端口
转自官方网页:http://www.firewalld.org/documentation/howto/open-a-port-or-service.html How to open port 80/ ...
- zabbix启动报错:Connection to database 'xxx' failed解决方法
Zabbix 分布式系统监视系统 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通 ...
- leetcode Ch6-Data Structure
1. Sliding Window Maximum class Solution { public: vector<int> maxSlidingWindow(vector<int& ...
- Json转Map
http = new HttpClient**();//此处封装一下发请求的类 Map<String, String> map = new HashMap<String, Strin ...
- 沉淀再出发:IoC和AOP的本质
沉淀再出发:IoC和AOP的本质 一.前言 关于IoC和AOP这两个概念,如果我们没有深入的理解可以说是根本就不理解Spring这个架构的,同样的由Spring演变出来的Spring Boot和Spr ...
- 数据链路层 点对点协议 PPP
点对点协议 PPP 一. PPP 协议应满足的需求 简单.提供不可靠的数据报服务,比IP协议简单,不需要纠错,不需要序号,不需要流量控制. 工作方式:接收方每收到一个帧就进行CRC校验,如正确就接受该 ...
- CopyrightHelper—开源VS插件辅助插入版权注释
前言 有很多时候,我们在写代码的时候需要在代码文件头加上描述和版权信息等,如果使用代码项目模板又得为每种文件定模板,而已不方便,如果从某个地方复制过来,又嫌麻烦... 为了能解决这种懒人的需求,我开始 ...
- Git 解决方案 commit your changes or stash them before you can merge
error: Your local changes to the following files would be overwritten by merge: *********** Please, ...
- centos7安装docker-ce新版
先卸载系统的旧版本yum remove docker \ docker-common \ docker-selinux \ ...
- vue-cli + webpack自动生成项目
# 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack palanWebsit ...