当前位置:网站首页>redis中常见的面试题
redis中常见的面试题
2022-08-04 04:30:00 【Dumpling_skin】
1、什么是缓存穿透?怎么解决?
1. 数据库中没有该记录,缓存中也没有该记录,这时有人恶意大量访问这样的数据。这样就会导致该请求绕过缓存,直接访问数据,从而造成数据库压力过大。
2.解决办法:
[1]在controller加数据校验。
[2]我们可以在redis中存入一个空对象,而且要设置过期时间不能太长。超过5分钟
[3]我们使用布隆过滤器。底层:有一个bitmap数组,里面存储了该表的所有id.
解决方法:
//伪代码
String get(String key) { //布隆过滤器钟存储的是数据库表钟对应的id
String value = redis.get(key); //先从缓存获取。
if (value == null) { //缓存没有命中
if(!bloomfilter.mightContain(key)){//查看布隆过滤器钟是否存在
return null;
}else{
value = db.get(key); //查询数据库
redis.set(key, value);
}
}
return value;
}2、什么是缓存击穿?如何解决?
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
缓存击穿解决方案:
1.设置永久不过期。【这种只适合内存比较大的服务器】
2.使用互斥锁(mutex key)业界比较常用的做法。
解决方法:
//伪代码
String get(String key) {
String value = redis.get(key);
if (value == null) { //代表缓存值过期
//设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
if(redis.setnx(key_mutex,1,3*60)==1){
//代表设置成功
value = db.get(key);
redis.set(key, value,expire_secs);
redis.del(key_mutex);
}else{
//这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
sleep(50);
//重试
get(key);
}
}else {
return value;
}
}3、什么是缓存雪崩?如何解决?
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
1.什么下会发生缓存雪崩:
[1]项目刚上线,缓存中没有任何数据
[2]缓存出现大量过期。
[3]redis宕机
2.解决办法:
1.上线前预先把一些热点数据放入缓存。
2.设置过期时间为散列值
3.搭建redis集群
4、Redis 淘汰策略有哪些?
当Redis中内存不足的时候,为了保证命中率,就会选择一定的数据淘汰策略。
volatile(从已经设置过期时间的key中)
allkeys(所有的key中)
1)volatile-lru:当内存不足时,从设置了过期时间的key中使用LRU(最近最少使用)算法,选出最近使用最少的数据,进行淘汰;
2)allkeys-lru:当内存不足时,从所有key中使用LRU(最近最少使用)算法,选出最近使用最少的数据,进行淘汰。
3)volatile-lfu:当内存不足时,从设置了过期时间的key中使用LFU(最近最不常用)算法,选出使频率最低的数据,进行淘汰。
4)allkeys-lfu:当内存不足时,从所有key中使用LFU算法,从所有key中使用LFU算法,选出使频率最低的数据,进行淘汰。
5)volatile-random:当内存不足时,从设置了过期时间的key中,随机选出数据,进行淘汰。
6)allkeys-random:当内存不足时,从所有的key中,随机选出数据,进行淘汰。
7)volatile-ttl:当内存不足时,从设置了过期时间的key中,选出即将过期的数据(按照过期时间的先后,选出先过期的数据),进行淘汰。
8)no-enviction:当内存不足时,禁止淘汰数据,写入操作报错默认策略,是Redis默认的内存淘汰策略。
边栏推荐
- 目标检测-中篇
- Introduction to the memory model of the JVM
- 7-3 LVS+Keepalived集群叙述与部署
- 基于 SSE 实现服务端消息主动推送解决方案
- 3000 words, is take you understand machine learning!
- Jenkins export and import Job Pipeline
- This Thursday evening at 19:00, the fourth live broadcast of knowledge empowerment丨The realization of equipment control of OpenHarmony smart home project
- 2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
- if,case,for,while
- 【id类型和NSObject指针 ObjectIve-C中】
猜你喜欢
随机推荐
2.15 keil使用电脑端时间日期
移动支付线上线下支付场景
unity框架之缓存池
备份工具pg_dump的使用《postgres》
Innovation and Integration | Huaqiu Empowerment Helps OpenHarmony Ecological Hardware Development and Landing
Jenkins 导出、导入 Job Pipeline
【21天学习挑战赛】顺序查找
[21 Days Learning Challenge] Image rotation problem (two-dimensional array)
本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
Structure function exercise
企业直播风起:目睹聚焦产品,微赞拥抱生态
【id类型和NSObject指针 ObjectIve-C中】
manipulation of file contents
Tensors - Application Cases
机器学习模型的“可解释性”
Introduction and application of go module
基于 SSE 实现服务端消息主动推送解决方案
拿捏JVM性能优化(自己笔记版本)
Explain详解与实践
[Ryerson emotional speaking/singing audiovisual dataset (RAVDESS)]









