场景: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)”】 戳这里,看该作者更多好文