最近在思考数据库以及缓存的问题, 发现这些知识点其实是有一点关联的, 于是这篇文章通过一个连环提问的方式将这些知识点串联起来.
问: 为什么要用 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 好一些, 虽然这些优势非常小.
来源: https://www.cnblogs.com/chanshuyi/p/the_history_of_database_03.html