文章首发于微信公众号「陈树义」,专注于 Java 技术分享的社区。点击链接扫描二维码,与500位小伙伴一起共同进步。微信公众号二维码 http://p3npq6ecr.bkt.clouddn.com/blog/chenshuyi_gongzhonghao_guide_full.jpg

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

  • 问:为什么要用 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 好一些,虽然这些优势非常小。

文章首发于微信公众号「陈树义」,专注于 Java 技术分享的社区。点击链接扫描二维码,与500位小伙伴一起共同进步。微信公众号二维码 http://p3npq6ecr.bkt.clouddn.com/blog/chenshuyi_gongzhonghao_guide_full.jpg

例如 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,例如多重嵌套的留言回复。

文章首发于微信公众号「陈树义」,专注于 Java 技术分享的社区。点击链接扫描二维码,与500位小伙伴一起共同进步。微信公众号二维码 http://p3npq6ecr.bkt.clouddn.com/blog/chenshuyi_gongzhonghao_guide_full.jpg

转载于:https://www.cnblogs.com/chanshuyi/p/the_history_of_database_03.html

数据库历险记(三) | 缓存框架的连环炮相关推荐

  1. 跟我学Springboot开发后端管理系统6:缓存框架Caffeine

    Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美.Caffeine受启发于Guava Cache的API,使用API和Guava是一致的.它借鉴了Guava Cache和Concur ...

  2. 三大缓存框架ehcache、memcache和redis的介绍

    三大缓存框架ehcache.memcache和redis的介绍 2016-04-12 架构说 4964 阅读 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存 ...

  3. 百度现场面试:JVM+算法+Redis+数据库!(三面)| CSDN博文精选

    戳蓝字"CSDN云计算"关注我们哦! 作者 |  中琦2513 转自 | CSDN博客 责编 | 阿秃 百度一面(现场) 自我介绍 Java中的多态 为什么要同时重写hashcod ...

  4. 精讲23种设计模式-基于装饰模式~设计多级缓存框架

    文章目录 一.装饰模式 1. 回顾多级缓存基本概念 2. 装饰模式基本的概念 3. 装饰模式应用场景 4. 装饰者模式定义 5. 基于Map手写Jvm内置缓存 二.手写一级与二级缓存 2.1. red ...

  5. SpringBoot集成Cache缓存(Ehcache缓存框架,注解方式)

    1.说明 Spring定义了CacheManager和Cache接口, 用来统一不同的缓存技术, 例如JCache,EhCache,Hazelcast,Guava,Redis等. 本文通过Spring ...

  6. springMVC集成缓存框架Ehcache

    概述 Ehcache算是当前比较流行的缓存框架,使用缓存可以极大的缓解服务器和数据库的压力,提高访问效率,提高服务器的并发能力.接下来我们看怎么把缓存在spring mvc种使用起来. 详细 代码下载 ...

  7. Redis数据库在分布式缓存中的应用研究

    本文主要讲解用Redis数据库作为分布式缓存. 目录 1.Redis简介 2.Redis应用场景 1.缓存 2.队列 3.单点登录 3.安装Redis (1)下载Redis (2)启动Redis (3 ...

  8. Java本地缓存框架系列-Caffeine-1. 简介与使用

    Caffeine 是一个基于Java 8的高性能本地缓存框架,其结构和 Guava Cache 基本一样,api也一样,基本上很容易就能替换. Caffeine 实际上就是在 Guava Cache ...

  9. 一文深入了解史上最强的Java堆内缓存框架Caffeine

    它提供了一个近乎最佳的命中率.从性能上秒杀其他一堆进程内缓存框架,Spring5更是为了它放弃了使用多年的GuavaCache 缓存,在我们的日常开发中用的非常多,是我们应对各种性能问题支持高并发的一 ...

最新文章

  1. springboot定时执行任务
  2. WebView显示的网页在大分辨率屏下被放大--解决方案
  3. Neo4j实战 (数据库技术丛书)pdf
  4. boost::mp11::mp_bind相关用法的测试程序
  5. linux 安装 Django14
  6. MySQL 处理插入重主键唯一键重复值办法
  7. XPath与lxml类库
  8. cpout引脚是干什么的_FPGA中差分信号的定义和使用(一)
  9. .NET中加密和解密的实现方法
  10. Redis 配置文件详解
  11. python表白代码大全简单-程序员python表白代码
  12. python 视频 添加字幕_爱剪辑加字幕之经验及Python程序批量加字幕
  13. 消防报警图形显示装置linux,消防中控-消防控制室图形显示装置状态识别及操作...
  14. i51130g7和i71160g7差多少 酷睿i5 1130G7和i7 1160G7差距
  15. ORACLE的jdbc驱动包版本
  16. Flutter基础七:Sliver,设置一些样式
  17. 基于SSM大学生宿舍交电费系统
  18. 消息中心(系统消息)实现
  19. python调用360浏览器浏览网页
  20. 手把手教你用深度学习做物体检测(四):模型使用

热门文章

  1. 打开u盘提示不在计算机中,U盘不被电脑识别怎么办 U盘在电脑上打不开解决方法...
  2. windows游戏编程_2020年适合程序员编程的笔记本电脑推荐
  3. deepnode处理过的图片_教你用PS快速修复图片脏乱和瑕疵,快来一起学习吧!
  4. ThinkPHP6内核通用网站后台权限管理系统源码
  5. android编辑框最大字数,TextView 限制最大行数、最小行数、字数超过“...”表示...
  6. vue函数input输入值即请求,优化为用户输入完成之后再请求
  7. paascloud商城系统源码v2.0-完整购物流程和后端运营平台
  8. Emlog使用qq头像作为评论头像
  9. Easytrader踩坑之旅(二)
  10. 关于application/x-www-form-urlencoded等字符编码的解释说明