当前位置:首页 » 文件管理 » 缓存击穿解决

缓存击穿解决

发布时间: 2023-01-01 11:11:22

A. java缓存前可以进后台方法,清完缓存不进了

关于java清缓存前可以进后台方法,清完缓存不进了相关资料如下
java我们在使用缓存时,往往先尝试去缓存中取值,如果没有,再去数据库取值,如果数据库也没有值,则根据业务需求,返回空或者抛异常。

如果用户一直访问一个数据库不存在的数据,比如id为-1的数据,就会导致每次请求都会先去缓存查一次,然后再去数据库查一次,造成严重的性能问题。这种情况就叫缓存穿透。

解决方案

以下几种解决方案:对请求参数做校验,比如用户鉴权校验,id做基础校验,id <= 0的直接拦截。

如果查询到数据库没有值,也将对应的key存进缓存中,value为null。这样下次查询就直接从缓存返回了。但这里的key的缓存时间应该比较短,比如30s。防止后面在数据库插入了这条数据,而用户获取不到。

使用布隆过滤器,判断一个key是否已经查过了,如果已经查过了,就不去数据库查询。

缓存击穿

缓存击穿指的是,一个key的访问量非常大,比如某秒杀活动,有1w/s的并发量。这个key在某一时刻过期,那这些大量的请求就会一瞬间到数据库,数据库可能会直接崩溃。

解决方案

缓存击穿的解决方案也有几种,可以配合使用:对于热点数据,慎重考虑过期时间,确保热点期间key不会过期,甚至有些可以设置永不过期。

使用互斥锁(比如Java的多线程锁机制),第一个线程访问key的时候就锁住,等查询数据库返回后,把值插入到缓存后再释放锁,这样后面的请求就可以直接取缓存里面的数据了。

缓存雪崩

缓存雪崩指的是,在某一时刻,多个key失效。这样就会有大量的请求从缓存中获取不到值,全部到数据库。还有另一种情况,就是缓存服务器宕机,也算做缓存雪崩。

解决方案

针对上述两种情况,缓存雪崩有两种解决方案:对每个key的过期时间设置一个随机值,而不是所有key都相同。

使用高可用的分布式缓存集群,确保缓存的高可用性,比如redis-cluster。

B. 缓存击穿互斥锁 设置锁的失效时间

  • 设置锁的失效时间是自己设置的,它的过期时间会很短,最长不超过五分钟

  • 缓存穿透是指查询一个一定不存在的数据

  • 由于缓存是不命中时被动写的,

  • 并且出于容错考虑,如果从存储层查不到数据则不写入缓存,

  • 这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。

  • 在流量大时,可能DB就挂掉了,

  • 要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

  • 最常见的则是采用布隆过滤器

  • 将所有可能存在的数据哈希到一个足够大的bitmap中,

  • 一个一定不存在的数据会被 这个bitmap拦截掉,

  • 从而避免了对底层存储系统的查询压力。

  • 另外也有一个更为简单粗暴的方法

  • 如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),

  • 我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟

C. 缓存穿透和缓存击穿有什么区别

两者计算的功能是不同的,因为它们所需的能量不同。
前者要达到的需求是要穿透这个设备,而另一个是需要完成击穿,通过正常运行。

D. redis常见问题

1. 缓存击穿

缓存击穿是指一个请求要访问的数据,缓存中没有,但数据库中有的情况。这种情况一般都是缓存过期了。

但是这时由于并发访问这个缓存的用户特别多,这是一个热点 key,这么多用户的请求同时过来,在缓存里面没有取到数据,所以又同时去访问数据库取数据,引起数据库流量激增,压力瞬间增大,直接崩溃给你看。

所以一个数据有缓存,每次请求都从缓存中快速的返回了数据,但是某个时间点缓存失效了,某个请求在缓存中没有请求到数据,这时候我们就说这个请求就"击穿"了缓存。

针对这个场景,对应的解决方案一般来说有三种。

借助Redis setNX命令设置一个标志位就行。设置成功的放行,设置失败的就轮询等待。就是在更新缓存时加把锁

后台开一个定时任务,专门主动更新过期数据

比如程序中设置 why 这个热点 key 的时候,同时设置了过期时间为 10 分钟,那后台程序在第 8 分钟的时候,会去数据库查询数据并重新放到缓存中,同时再次设置缓存为 10 分钟。

其实上面的后台续命思想的最终体现是也是永不过期。

只是后台续命的思想,会主动更新缓存,适用于缓存会变的场景。会出现缓存不一致的情况,取决于你的业务场景能接受多长时间的缓存不一致。


2. 缓存穿透

缓存穿透是指一个请求要访问的数据,缓存和数据库中都没有,而用户短时间、高密度的发起这样的请求,每次都打到数据库服务上,给数据库造成了压力。一般来说这样的请求属于恶意请求。

解决方案有两种:

就是在数据库即使没有查询到数据,我们也把这次请求当做 key 缓存起来,value 可以是 NULL。下次同样请求就会命中这个 NULL,缓存层就处理了这个请求,不会对数据库产生压力。这样实现起来简单,开发成本很低。


3. 缓存雪崩

缓存雪崩是指缓存中大多数的数据在同一时间到达过期时间,而查询数据量巨大,这时候,又是缓存中没有,数据库中有的情况了。

防止雪崩的方案简单来说就是错峰过期。

在设置 key 过期时间的时候,在加上一个短的随机过期时间,这样就能避免大量缓存在同一时间过期,引起的缓存雪崩。

如果发了雪崩,我们可以有服务降级、熔断、限流手段来拒绝一些请求,保证服务的正常。但是,这些对用户体验是有一定影响的。

4. Redis 高可用架构

Redis 高可用架构,大家基本上都能想到主从、哨兵、集群这三种模式。

哨兵模式:

它主要执行三种类型的任务:

哨兵其实也是一个分布式系统,我们可以运行多个哨兵。

然后这些哨兵之间需要相互通气,交流信息,通过投票来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。

哨兵之间采用的协议是 gossip,是一种去中心化的协议,达成的是最终一致性。

选举规则:

E. Linux运维工程师会面试哪些

给大家分享一些Linux面试题的笔记,从负载均衡、nginx、MySQL、redis、kafka、zabbix、k8s等方面拆解 Linux 知识点。用来对个人技术点进行查漏补缺。
目录:
1. 磁盘使用率检测(用shell脚本
2. LVS 负载均衡有哪些策略?
3. 谈谈你对LVS的理解?
4. 负载均衡的原理是什么?
5. LVS由哪两部分组成的?
6. 与lvs相关的术语有哪些?
7. LVS-NAT模式的原理
8. LVS-NAT模型的特性
9. LVS-DR模式原理
10. LVS-DR模型的特性
11. LVS三种负载均衡模式的比较
12. LVS的负载调度算法
13. LVS与nginx的区别
14. 负载均衡的作用有哪些?
15. nginx实现负载均衡的分发策略
16. keepalived 是什么?
17. 你是如何理解VRRP协议的
18. keepalived的工作原理?
19. 出现脑裂的原因
20. 如何解决keepalived脑裂问题?
21. zabbix如何监控脑裂?
22. nginx做负载均衡实现的策略有哪些
23. nginx做负载均衡用到哪些模块
24. 负载均衡有哪些实现方式
25. nginx如何实现四层负载?
26. 你知道的web服务有哪些?
27. 为什么要用nginx
28 . nginx的性能为什么比apache高?
29 . epoll的组成
30 . nginx和apache的区别
31. Tomcat作为web的优缺点?
32. tomcat的三个端口及作用
33. fastcgi 和cgi的区别
34. nginx常用的命令
35. 什么是反向代理,什么是正向代理,以及区别?
36. Squid、Varinsh、Nginx 有什么区别?
37. nginx是如何处理http请求的
38. nginx虚拟主机有哪些?
39. nginx怎么实现后端服务的健康检查
40. apache中的Worker 和 Prefork 之间的区别是什么?
41. Tomcat缺省端口是多少,怎么修改
42. Tomcat的工作模式是什么?
43. Web请求在Tomcat请求中的请求流程是怎么样的?
44. 怎么监控Tomcat的内存使用情况
45. nginx的优化你都做过哪些?
46. Tomcat你做过哪些优化
47. nginx的session不同步怎么办
48. nginx的常用模块有哪些?
49. nginx常用状态码
50. 访问一个网站的流程
51. 三次握手,四次挥手
52. 什么是动态资源,什么是静态资源
53. worker支持的最大并发数是什么?
54. Tomcat和Resin有什么区别,工作中你怎么选择?
55. 什么叫网站灰度发布?56.. 统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip
57. nginx各个版本的区别
58. nginx最新版本
59. 关于nginx access模块的面试题
60. nginx默认配置文件
61. location的规则
62. 配置nginx防盗链
63. drop,delete和truncate删除数据的区别?
64. MySQL主从原理
65. MySQL主从复制存在哪些问题?
66. MySQL复制的方法
67. 主从延迟产生的原因及解决方案?
68. 判断主从延迟的方法
69. MySQL忘记root密码如何找回
70. MySQL的数据备份方式
71. innodb的特性
72. varchar(100) 和varchar(200)的区别
73. MySQL主要的索引类型
74. 请说出非关系型数据库的典型产品、特点及应用场景?
75. 如何加强MySQL安全,请给出可行的具体措施?
76. Binlog工作模式有哪些?各什么特点,企业如何选择?
77. 生产一主多从从库宕机,如何手工恢复?
78. MySQL中MyISAM与InnoDB的区别,至少5点
79. 网站打开慢,请给出排查方法,如是数据库慢导致,如何排查并解决,请分析并举例?
80. xtrabackup的备份,增量备份及恢复的工作原理
81.误执行drop数据,如何通过xtrabackup恢复?
82. 如何做主从数据一致性校验?
83. MySQL有多少日志
84. MySQL binlog的几种日志录入格式以及区别
85. MySQL数据库cpu飙升到500%的话他怎么处理?
86. redis是单线程还是多线程?
87. redis常用的版本是?
88. redis 的使用场景?
89. redis常见的数据结构
90. redis持久化你们怎么做的?
91. 主从复制实现的原理
92. redis哨兵模式原理
93. memcache和redis的区别
94. redis有哪些架构模式?
95. 缓存雪崩?
96. 缓存穿透
97. 缓存击穿
98. redis为什么这么快
99. memcache有哪些应用场景
100. memcache 服务特点及工作原理
101. memcached是如何做身份验证的?
102. mongoDB是什么?
103. mongodb的优势
104. mongodb使用场景
105. kafka 中的ISR,AR代表什么,ISR伸缩又代表什么
106.kafka中的broker 是干什么的
107. kafka中的 zookeeper 起到什么作用,可以不用zookeeper么
108. kafka follower如何与leader同步数据
109. kafka 为什么那么快
110. Kafka中的消息是否会丢失和重复消费?
111. 为什么Kafka不支持读写分离?
112. 什么是消费者组?
113. Kafka 中的术语114. kafka适用于哪些场景
115. Kafka写入流程:
116. zabbix有哪些组件
117. zabbix的两种监控模式
118. 一个监控系统的运行流程
119. zabbix的工作进程
120. zabbix常用术语
121. zabbix自定义发现是怎么做的?
122. 微信报警
123. zabbix客户端如何批量安装
124. zabbix分布式是如何做的
125. zabbix proxy 的使用场景
126. prometheus工作原理
127. prometheus组件
128. ELK工作流程
129. logstash的输入源有哪些?
130. logstash的架构
131. ELK相关的概念
132. es常用的插件
134. zabbix你都监控哪些参数
135. MySQL同步和半同步
136. CI/CD
137 K8S监控指标
138. k8s是怎么做日志监控的
139. 【运维面试】k8s中service和ingress的区别
140. k8s组件的梳理
141. 关于tcp/IP协议
142. 谈谈你对CDN的理解

F. 缓存击穿、穿透、雪崩及Redis分布式锁

分布式锁: setnx ,redisson 并发问题
幂等问题: 落表状态,Redis

缓存击穿: 指缓存中无,db中有
原因: 一个key高并发恰好失效导致大量请求到db
方案: 加锁,自旋锁,或一个线程查db,一个线程监控(直接用Redisson分布式锁)

缓存穿透:指缓存和db中均无
原因: 一般是恶意请求
方案: 加布隆过滤,或查db无时,也设置缓存,value为某些特殊表示或"null"

雪崩:指缓存同时大量失效
原因: 大量的key同时失效,db压力加大
方案: 设置失效时间是增加随机数

问题方案文献:
https://www.jianshu.com/p/31ab9b020cd9 (图例分析)

https://blog.csdn.net/fcvtb/article/details/89478554

Redis分布式锁:

事务未执行完锁已到期释放问题:使用Redissoin解决续租问题,内部已解决

分布式锁文献:
https://www.jianshu.com/p/4838f8be00c9
https://blog.csdn.net/qq_30038111/article/details/90696233 (setnx + expire同时操作)

====================================

https://www.runoob.com/redis/keys-scan.html
https://www.jianshu.com/p/611a492d9121 Redis原理与应用

G. 接口添加redis缓存之后并发还是很低

把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下:

(一)缓存和数据库间数据一致性问题

分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。

(二)缓存击穿问题

热点内容
pythongzip解压 发布:2025-08-26 14:55:10 浏览:409
wifi的密码是什么意思啊 发布:2025-08-26 14:45:43 浏览:760
3070linux驱动 发布:2025-08-26 14:42:48 浏览:126
编程小课包 发布:2025-08-26 14:35:35 浏览:801
分卷解压不了 发布:2025-08-26 13:38:10 浏览:217
word2010加密怎么 发布:2025-08-26 13:36:36 浏览:672
访问学者访问时间 发布:2025-08-26 13:33:46 浏览:581
tc软件编程 发布:2025-08-26 13:33:44 浏览:312
医保卡的密码怎么修改密码 发布:2025-08-26 13:23:53 浏览:627
编译器产生汇编语言而非机器语言 发布:2025-08-26 13:16:59 浏览:260