浅谈缓存与Mysql的区别

試著忘記壹切 提交于 2019-11-29 11:05:00

缓存是互联网公司最常用的组件之一,面试中绝大多数的公司也都会问关于缓存的问题。缓存的作用想必不用说,大家随口就能说出来,存储过热数据,防止数据库访问量多大,加快数据访问速度。甚至有的业务可以拿缓存当数据库用,虽然很不建议这么用,但是既然能这么用,必然有这么用的好处。

缓存和关系型数据库之间的区别其实蛮大的,笔者认为有以下几点吧。

首先,在存储数据的数据结构上就有很大的差别,传统的关系型数据库,就是table、columns,存储数据的颜值比较高(比较符合我们观察数据的习惯),存储方式和格式也多种多样。缓存就不一样了,它是key/value结构的数据,虽然redis中可以支持多种数据格式,但是都是建立在key的基础上,所以从存储数据的多样性方面,关系型数据库暂时还是不可被缓存替代的。

其次,在查询速度方面,肯定是缓存高了,虽然数据库可以建立索引,以Mysql-InnoDB为例,大家都知道他的索引格式是B+Tree,时间复杂度是 O(log(n)) ,而缓存就很明显了,时间复杂度是O(1)。

那么问题来了,为什么k/v这种数据结构的时间复杂度低,Mysql去选择B+Tree这种格式的数据去存储索引呢。

这也和第一点,数据存储有关。原因有两个,次要原因是这种数据结构比较符合磁盘查找数据的动作(与盘片旋转和磁臂移动还有树的高度有关),而把key存在内存里就可以解决这个问题,比如Mysql启动把索引存在内存里,在对应到磁盘上,为什么没有这么做呢,主要原因来了,就是大家常用的,数据库是需要支持范围查找的,而k/v不能支持。所以在查找数据方面,缓存虽然快,但是多样性上差了点。redis官方所有支持的qps大约在1w-1.5w,而mysql可以支持3k+的qps也还要看查询语句是否有慢查询。

再次,在集群方面的区别,Mysql是单集群的操作,为什么怎么说呢。虽然Mysql可以有主从来保证高可用,但是,主从也只能是一主多从,进行写的数据库永远只有一个。而我们对数据量大的大表,只能依赖分库分表来解决,分库分表去查询数据,更多要依赖上层服务了。而缓存就不一样了,redis是天然支持集群,memcache也可以用一致性hash算法后天的来集成集群,而且不用怕数据过热,他们就是解决这个问题的!

最后,从数据的持久化来说,缓存绝对是不如数据库的,memcache不支持持久化,redis有快照和AOF两种,但是都各有缺点,同时也会出现数据丢失,对于一些对数据存储要求不高的业务,可以选择把数据存在缓存里,其他的,绝不建议。

缓存和数据库是相辅相成的,缓存可以缓解数据库的压力,而数据库可以保证数据的持久化,在大多数领域,他们是可以相互配合的很好的。但是在开发过程中,如果因为压力过大而采用了缓存来缓解数据库压力的话,还要防止一些缓存雪崩、缓存穿透等问题。

 

欢迎关注订阅微信公众号,程序员的压哨绝杀,一起分享生活工作中的见闻趣事。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!