2021--redis面试

2021/9/21 19:11:35

本文主要是介绍2021--redis面试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1 什么是缓存雪崩?–首先缓存作用:第一:缓存查询速度比查询数据库快;第二:分担了部分请求,支持更高的并发;雪崩:原因一:Redis挂掉了,请求全部走数据库。
二:对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。
危害:缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!

2 雪崩的结局方案:一:在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。

其他:对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:

事发前:实现Redis的高可用(主从架构+Sentinel 或者Redis Cluster),尽量避免Redis挂掉这种情况发生。

事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)

事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

3 什么是缓存穿透???-----缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。

4 如何解决缓存穿透?解决缓存穿透也有两种方案:
一:由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)或者压缩filter提前拦截,不合法就不让这个请求到数据库层!
二:当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。
这种情况我们一般会将空对象设置一个较短的过期时间!!!

5 缓存与数据库双写一致???读操作:一般我们对读操作的时候有这么一个固定的套路

如果我们的数据在缓存里边有,那么就直接取缓存的。
如果缓存里没有我们想要的数据,我们会先去查询数据库,然后将数据库查出来的数据写到缓存中。
最后将数据返回给请求;---------更新问题出现:当我们要更新时候呢?各种情况很可能就造成数据库和缓存的数据不一致了。
这里不一致指的是:数据库的数据跟缓存的数据不一致!!!

解决更新不一致问题:先操作数据库,1 再操作缓存
2 先操作缓存,再操作数据库-----优缺点比较和适用场景:对比两种策略
我们可以发现,两种策略各自有优缺点:
先删除缓存,再更新数据库
在高并发下表现不如意,在原子性被破坏时表现优异
先更新数据库,再删除缓存(Cache Aside Pattern设计模式)
在高并发下表现优异,在原子性被破坏时表现不如意

3 redis为何快?redis采用C编写,redis服务器是核心业务采用单线程模式,无锁竞争且基于内存操作,执行效率非常高。



这篇关于2021--redis面试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程