当前位置:网站首页>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默认的内存淘汰策略。
边栏推荐
- The video of machine learning to learn [update]
- 深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型
- Mobile payment online and offline payment scenarios
- unity框架之缓存池
- Implementing a server-side message active push solution based on SSE
- PL/SQL Some Advanced Fundamental
- 【21 Days Learning Challenge】Direct Insertion Sort
- 数据治理平台项目总结和分析
- 本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
- docker安装mysql与宿主机相差8小时的问题。
猜你喜欢
转:管理是对可能性的热爱,管理者要有闯进未知的勇气
外卖店优先级
SQL interview Questions
某母婴小程序加密参数解密
The video of machine learning to learn [update]
base address: environment variable
7-1 LVS+NAT load balancing cluster, NAT mode deployment
See how DevExpress enriches chart styles and how it empowers fund companies to innovate their business
JVM笔记
3000 words, is take you understand machine learning!
随机推荐
Jenkins 导出、导入 Job Pipeline
汇编语言之栈
Jenkins export and import Job Pipeline
【21天学习挑战赛】直接插入排序
Tensors - Application Cases
The video of machine learning to learn [update]
2003. 每棵子树内缺失的最小基因值 DFS
7-2 LVS+DR Overview and Deployment
10 Convolutional Neural Networks for Deep Learning 3
结构体函数练习
2022 Hangzhou Electric Power Multi-School League Game 5 Solution
【id类型和NSObject指针 ObjectIve-C中】
深度学习之 10 卷积神经网络3
【21 Days Learning Challenge】Direct Insertion Sort
7-1 LVS+NAT 负载均衡群集,NAT模式部署
A Preliminary Study of RSS Subscription to WeChat Official Account-feed43
Based on the statistical QDirStat Qt directory
Converts XML tags to TXT format (voc conversion for yolo convenient training)
Take care of JVM performance optimization (own note version)
什么是数字孪生智慧城市应用场景