面了BAT 大厂,我总结了他们会问的Redis基础知识

一、缓存的常规使用流程

传统行业时代,缓存使用还没普及,当时的互联网产业并不发达,很多传统行业的公司并发量并不高,靠着几台ecs及其搭建的集群对外提供分布式服务,不使用缓存一样能够把项目运行的很好。后面互联网快速兴起,项目的并发量越来越大,原有技术已经远远不能满足当下的产品需要,所以很多项目开始快速迭代升级,对于缓存的使用也就全面进入了互联网行业。

随着缓存使用的普及,也暴露出一些使用上的问题,比如缓存穿透的解法有哪些,如何避免缓存雪崩效应?首先我们来看一下一般系统是如何使用缓存的。当系统收到一个查询请求时,会先从缓存中查找数据,如果缓存中有数据,那么取出直接返回;如果没有数据那就从数据库中读取数据,然后更新到缓存中,然后返回数据,这样下次再获取数据时,直接从缓存中读取。
在这里插入图片描述

这种方案在并发亮不高的的情况时,使用起来是没有问题的,但是并发较高的时候,我的建议是缓存一直存在,通过后台系统更新缓存数据,保证数据一致性的目的,而这种方案在并发很高的情况下会存在漏洞,这个漏洞就是缓存穿透的情况。

二、缓存穿透

在这里插入图片描述

什么是缓存穿透?指的是查询一个一定不存在的数据,由于缓存不命中时,会从数据库中查询,如果有热点数据或者恶意攻击的话,很容易对数据库造成非常大的压力,造成宕机,那么面对这种缓存穿透的情况,有没有什么好的解决办法呢?
在这里插入图片描述

其实有一个比较巧妙的方法,就是将不存在的key预先设定一个值,比如空字符串或者null,这样就会将绝大多数空值请求挡在缓存这一层。还有一个办法是使用布隆过滤器,它实际上是一个很长的二进制向量和一些列随机映射函数,用于检索一个元素是否在一个集合中,优点是控件效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率,并且删除很复杂。过滤器的原理是很复杂的,自己实现一套成本比较高,可以使用Google的guava工具。

除了缓存穿透的场景,还有一个场景是缓存并发,即大量请求同时查询/更新redis,会占用大量的redis资源,这里我们使用setNX方法,接收到数据查询请求后,判断缓存中是否为空,如果为空,使用setNX设置标识位,如果设置成功,表示已经锁定成功,这时候请求从数据库读取数据,然后更新缓存,最后将数据返回客户端。如果设置失败,表明当前redis key已经被其他资源锁定,等待一段时间后再次发起请求,这样就能保证在同一时间只能有一个请求来查询数据库更新,其他请求只能等待。

三、缓存并发

除了缓存穿透的场景,还有一个场景是缓存并发,即大量请求同时查询/更新redis,会占用大量的redis资源,这里我们使用setNX方法,接收到数据查询请求后,判断缓存中是否为空,如果为空,使用setNX设置标识位,如果设置成功,表示已经锁定成功,这时候请求从数据库读取数据,然后更新缓存,最后将数据返回客户端。如果设置失败,表明当前redis key已经被其他资源锁定,等待一段时间后再次发起请求,这样就能保证在同一时间只能有一个请求来查询数据库更新,其他请求只能等待。
在这里插入图片描述

四、缓存过期

第三种场景是缓存过期,如果使用不当,不仅会造成缓存穿透,还会造成缓存雪崩的效应出现。一般我们在使用缓存时,都会设置过期时间用于节省控件,比如1分钟或5分钟,并发很高的时候,可能出现某一个时间点,缓存同时过期,所有请求同时转发到数据库中,给数据库造成比较大的压力,也可能会给下游系统带来很高的压力,造成缓存雪崩现象。

那么如何解决呢?一种方法是缓存过期时间设置为一个随机值,将过期时间错开。
在这里插入图片描述
第二个解决方案是缓存不过期,通过后台系统来更新缓存数据,保障缓存不过期,这里就不做赘述了。

五、缓存热点问题

相信大家都对微博热点宕机事件不陌生,很多大v数据往往能占据80%的请求量,一旦这些数据对应的缓存过期,海量请求转发至数据库,会给数据库带来极大的压力,那么如何解决缓存热点问题呢?

通过判断最新访问时间来做排名,过滤掉不常访问的数据,留下经常访问的数据,也就是常说的lru淘汰机制。可以使用缓存系统做一个队列,根据用户请求时间更新缓存队列。常见的可以用zset队列,然后请求时间作为排序字段,定期清理,不过其实一般redis在购买时都会配置lru策略。

六、缓存操作与业务分离

很多人包括我自己在内,每当开发一个新的业务系统时,往往需要从新写一套缓存的各种读取api操作,耦和十分严重,那么有没有办法实现业务和缓存操作分离呢?最好的办法是利用数据库的binlog,监听binlog更新事件,投递MQ消息,异步更新缓存。
在这里插入图片描述

七、结语

本文主要总结了缓存的基本用法和几种缓存使用不当的场景和解法,下一篇文章将讲解一下布隆过滤器的原理,有什么想听的知识和疑问,欢迎评论区随时留言。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挖你家服务器电缆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值