场景:Redis面试
面试官:我看到你的简历上说你熟练经常使用Redis,那么你讲一下Redis是干嘛用的?:(心中窃喜,Redis不就是缓存吗?)Redis关键用作缓存,经过内存高效地存储非耐久化数据。面试官:Redis可以用作耐久化的存储吗?:嗯...应该可以吧...面试官:那Redis怎样启动耐久化操作呢?面试官:Redis的内存淘汰机制有哪些?面试官:咱们还可以用Redis做哪些事情?区分应用了Redis的哪个指令?小王:我只知道Redis还可以做散布式锁、信息队列...面试官:好了,咱们进入下一个话题...
思索:很显著,小王同窗在面试环节中关于Redis的体现和回答必需是比拟失败的。Redis是咱们上班中每天都会经常使用到的物品,为什么一到面试却变成了丢分项呢?
作为开发者,咱们习气了经常使用大神们曾经封装好的物品,以此保证咱们能够更专一于业务开发,却不知道这些罕用工具的底层成功是什么,因此虽然往常运行起来随心所欲,但一到面试还是无法让面试官眼前一亮。
本文总结了一些Redis的常识点,有原理有运行,宿愿可以协助到大家。
Redis是什么
这里我援用了Redis教程里对Redis的形容,很官网,然而很规范。 可基于内存亦可耐久化的日志型、Key-Value数据库。我以为这个形容很贴切很片面。
1. Redis的行业位置
Redis是互联网技术畛域经常使用最为宽泛的存储两边件,因超高的性能、多方面的运行才干以及丰盛完善的客户端允许在存储方面独当一面,广受好评,尤其以其性能和读取速度而成为了畛域中最受青眼的两边件。基本上每一个软件公司都会经常使用Redis,其中包括很多大型互联网公司,比如京东、阿里、腾讯、github等。因此,Redis也成为了后端开发人员必无法少的技艺。
2. 常识图谱
在我看来,学习每一项技术,都须要有一个明晰的头绪和结构,不然你也不知道自己会了哪些、还有多少没学会。就像一本书,假设没有目录章节,也就失去了灵魂。
因此我试图总结出Redis的常识图谱,也称为脑图,如下图所示,或许常识点不是很全,后续会不时降级补充。
本系列文章的常识点也会和这个脑图基本分歧,本文先引见Redis的基本常识,后续文章会详细引见Redis的数据结构、运行、耐久化等多个方面。
Redis好处
1. 速度快
作为缓存工具,Redis最广为人知的特点就是快,究竟有多快呢?Redis单机qps(每秒的并发)可以到达110000次/s,写的速度是81000次/s。那么,Redis为什么这么快呢?
2. 丰盛的数据类型
Redis有5种罕用的数据类型:String、List、Hash、set、zset,每种数据类型都有自己的用途。
3. 原子性,允许事务
Redis允许事务,并且它的一切操作都是原子性的,同时Redis还允许对几个操作兼并后的原子性口头。
4. 丰盛的个性
Redis具备丰盛的个性,比如可以用作散布式锁;可以耐久化数据;可以用作信息队列、排行榜、计数器;还允许publish/subscribe、通知、key过时等等。当咱们要用两边件来处置实践疑问的时刻,Redis总能施展出自己的用途。
Redis和Memcache对比
Memcache和Redis都是低劣的、高性能的内存数据库,普通咱们说到Redis的时刻,都会拿Memcache来和Redis做对比。(为什么要做对比呢?当然是要烘托出Redis有多好,没有对比,就没有损伤~)对比的方面包括:
(1) 存储方式
(2) 数据允许类型
(3) 经常使用的底层模型
(4) 存储值大小
看到这里,会不会感觉Redis特意好,全是好处?其实Redis还是有很多缺陷的,这些缺陷往常咱们该如何克制呢?
Redis存在的疑问及处置打算
1. 缓存数据库的双写分歧性的疑问
疑问:分歧性的疑问是散布式系统中很经常出现的疑问。分歧性普通分为两种:强分歧性和最终分歧性,当咱们要满足强分歧性的时刻,Redis也无法做到无瑕,由于数据库缓和存双写,必需会出现不分歧的状况,Redis只能保证最终分歧性。
处置:咱们如何保证最终分歧性呢?
2. 缓存雪崩疑问
疑问:咱们应该都在电影里看到过雪崩,开局很安静,而后一瞬间就开局崩塌,具备很强的消灭性。这里也是一样的,咱们口头代码的时刻将很多缓存的实效期间设定成一样,接着这些缓存在同一期间都会实效,而后都会从新访问数据库降级数据,这样会造成数据库衔接数过多、压力过大而解体。
处置:
3. 缓存穿透疑问
疑问: 缓存穿透是指一些非失罕用户(黑客)故意去恳求缓存中不存在的数据,造成一切的恳求都集中到到数据库上,从而造成数据库衔接意外。
处置:
4. 缓存的并发竞争疑问
疑问:
缓存并发竞争的疑问,关键出当初多线程对某个key启动set的时刻,这时会出现数据不分歧的状况。
比如Redis中咱们存着一个key为amount的值,它的value是100,两个线程同时都对value加100而后降级,正确的结果应该是变为300。然而两个线程拿到这个值的时刻都是100,结果也就是200,这就造成了缓存的并发竞争疑问。
处置
Redis的过时战略
Redis随着数据的增多,内存占用率会继续变高,咱们以为一些键抵达设置的删除期间就会被删除,然而期间到了,内存的占用率还是很高,这是为什么呢?
Redis驳回的是活期删除和惰性删除的内存淘汰机制。
1. 活期删除
活期删除和定时删除是有区别的:
2. 惰性删除
举个便捷的例子:中学的时刻,往常作业太多,基本做不完,教员说下节课要讲这个卷子,你们都做完了吧?其实有很多人没做完,所以须要在下节课之前连忙补上。
惰性删除也是这个情理,咱们的这个值按理说应该没了,然而它还在,当你要失掉这个key的时刻,发现这个key应该过时了,连忙删了,而后前往一个'没有这个值,曾经过时了!'。
如今咱们有了活期删除 +惰性删除的过时战略,就可以居安思危了吗?并不是这样的,假设这个key不时不访问,那么它会不时滞留,也是不正当的,这就须要咱们的内存淘汰机制了。
Redis的内存淘汰机制普通有6种,如下图所示:
那么咱们如何去性能Redis的内存淘汰机制呢?
在Redis.conf中咱们可以启动性能
小结
本文初探Redis,大略整顿出了Redis的常识图谱,对照之下可以发现Redis居然有这么多的常识点须要学习;接着咱们剖析了Redis的优缺陷,知道了其基于内存的高效的读写速度和丰盛的数据类型,也剖析了Redis面对数据分歧性、缓存穿透、缓存雪崩等疑问时该如何处置;咱们了解了Redis的过时战略缓和存淘汰机制。
置信大家曾经对Redis有了一些了解, 下篇文章 咱们将剖析Redis的数据结构、每一种数据类型是如何成功的、对应的命令有哪些。
【本文是专栏机构宜信技术学院的原创文章,微信群众号“宜信技术学院( id: CE_TECH)”】
戳这里,看该作者更多好文
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://clwxseo.com/wangluoyouhua/8176.html