关于 Redis ,这里有你不知道的知识

 

关于 Redis ,这里有你不知道的知识

文章插图
前言
本篇文章不是一篇具体的教程,阿粉打算记录一下自己对redis的一些思考 。说来惭愧,阿粉刚接触Redis的时候只是简单地使用了一下,背了一些面试题 , 就在简历上写下了Redis这个技能点 。
我们能在网络上轻易地找到关于Redis具体知识点的讲解,但很少有文字说明为什么会有这项技术 , 阿粉希望通过本文总结一下个人目前对Redis的理解 。
1. 初识Redis
最开始的时候,阿粉是通过网络上面的一些项目教程了解到Redis的,当时教程里说把首页数据放到Redis里,能够加快首页数据的访问速度,于阿粉我就照做了 。代码跑起来后,发现好像确实加载得蛮快的,就当完成了 。
项目做完后 , 写到了简历里,顺便在技能里写上熟练使用Redis , 再背了几道关于Redis的数据类型 , 持久化机制的面试题,便去找实习了 。
当时面试的时候面试官问阿粉:你为什么使用Redis呀?
阿粉按照项目教程里说的复述了一遍:因为能让首页更快地加载数据,咱们的产品首页是很重要,越快加载出数据,用户越满意......
现在回想起来真是哭笑不得,你也不能说这个回答有问题,Redis用作缓存的一大亮点就是能够加快数据查询效率 , 但是如果从技术面试的角度看,这个回答其实更应该从技术的角度去答,这也是促使阿粉写这篇文章的冲动之一 。
2. 为什么要有Redis这项技术?(你为什么用Redis)
如果现在再被问到为什么要用Redis,阿粉打算从计算机的存储结构开始聊 。
计算机界有一本名书《深入理解计算机系统》,里面有一幅关于计算机存储结构的图,非常经典:
由图可见计算机的存储器是一个金字塔结构,越上层的存储器存储效率越高,越下层的存储效率越低 。而计算机中内存的层级位于磁盘之上,内存的存储效率要比磁盘快得多 。
正常情况下,我们会把应用的数据存放在数据库中,数据库把数据存放在磁盘;而Redis是一款基于内存的存储系统,数据都存在内存里 , 这就是从Redis读取数据比从数据库读取数据要快的根本原因了 。
看到这里你可能会说,把数据存在内存有啥了不起的,我可以用谷歌的guava呀!再不济,我可以直接new一个HashMap存数据呀,这不都是基于内存的吗?
这个问题让我联想起了我在网上看面经的时候看到的一道题:如果让你设计一个缓存,你会怎么设计?
大家可以想一下guava和Map集合使用时的缺点是什么?
很明显一点就是这两者虽然基于内存,但他们使用的是jvm的内存,如果jvm挂掉或者重启了,数据也就丢失了 。这就能方便我们联想到Redis的持久化机制,Redis的持久化机制使得内存中的数据能够持久化到磁盘上,解决内存数据掉电易失的问题,而且Redis是一款中间件,无需依赖于jvm 。
(当初我只是死背Redis的持久化机制,并没有想过为什么 。我想搞清楚了这背后的关系后再去学习,能够学得更扎实一些吧)
再换一个角度:既然数据库是因为磁盘才慢,那为啥不再内存里实现数据库呢?
还别说,SAP公司还真有基于内存的数据库系统,但是使用内存有一个致命的缺点:那就是贵!能买得起那套软件和巨大内存机器的公司毕竟是少数,所以说为什么要使用Redis,就是因为他在低效的磁盘和昂贵的内存中取了一个折中 。
补充:面试的时候还被问到一个问题:Redis的内存淘汰机制
当时直接懵圈了,后来想了一下其实这是一个再正常不过的考点了:Redis把数据存放在内存,内存的空间有限,总会有用完的一天 。当内存使用完之后肯定需要有相应的内存淘汰策略来释放内存 。
不过说到内存淘汰,我还想起一个高级点的知识点,由于Redis的内存是有限的,我们使用内存的时候应该更加小心 。Redis内部是有许多高效使用内存的招数的,比如说我们存放用户信息的时候,把用户信息存成一个hash,要比把用户信息逐条用key-value存储占的空间小得多,这些知识你可以在Redid的官网上找到 。
3. 关于Redis的主从复制,哨兵,集群
在学习Redis之前,我对分布式的知识了解得非常少 。当时为了面试背Redis的面试题 , 背到有关主从复制,哨兵,集群等知识点的时候,我既兴奋又茫然 。感觉自己背完后掌握了许多分布式的知识 , 但是把这些知识点都揉在一起了,根本不知道这背后的逻辑是什么 。现在想通了一些 , 应该好好记下来:


推荐阅读