redis常见面试题

为了支持大量用户登录,都做了什么工作:

1、引入Redis,提前缓存竞赛对象,使得用户登录和答题都尽量避免走mysql

2、静态资源存储cdn

3、图片服务器分离

4、横向扩展服务器、负载均衡

5、使用redis计数进行限流

6、合并请求,减少前端对后台的请求次数

7、降级,部分功能的请求直接返回

 

防止Redis挂掉,流量直接打到mysql的方法:redis进行主从复制,一主多从,主实例挂了

之后直接切换从实例,然后通过redis的持久化AOF+RDB恢复缓存数据。

 

所有的key在同一时间失效,所有流量都打到mysql,就是缓存雪崩;

防止缓存雪崩:
1、每个key的失效时间都加上随机值,防止所有数据同时失效

2、定时任务重新缓存,定时任务缓存时间小于缓存失效时间,比如缓存保存12小时,那么定时任务每隔11个小时进行重新缓存数据

3、设置部分热点数据永不失效,数据更新的同时直接更新缓存便可

 

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求;

防止缓存穿透:

1、在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return

2、从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应KeyValue对写为false

3、对单个IP每秒访问次数超出阈值的IP都拉黑

4、Redis还有一个高级用法布隆过滤器(Bloom Filter这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KVreturn

 

缓存击穿跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

 

防止缓存击穿:

1、定时任务重新缓存,定时任务缓存时间小于缓存失效时间,比如缓存保存12小时,那么定时任务每隔11个小时进行重新缓存数据

2、设置热点数据永不失效,数据更新的同时直接更新缓存便可

 

 

 

posted @ 2020-02-21 15:10  cfYu  阅读(154)  评论(0编辑  收藏  举报