成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

緩存雪崩,緩存穿透,緩存擊穿出現(xiàn)的原因及解決方案?

存儲(chǔ)
假設(shè)有如下一個(gè)系統(tǒng),高峰期請(qǐng)求為5000次/秒,4000次走了緩存,只有1000次落到了數(shù)據(jù)庫(kù)上,數(shù)據(jù)庫(kù)每秒1000的并發(fā)是一個(gè)正常的指標(biāo),完全可以正常工作,但如果緩存宕機(jī)了,或者緩存設(shè)置了相同的過(guò)期時(shí)間,導(dǎo)致緩存在同一時(shí)刻同時(shí)失效,每秒5000次的請(qǐng)求會(huì)全部落到數(shù)據(jù)庫(kù)上,數(shù)據(jù)庫(kù)立馬就死掉了,因?yàn)閿?shù)據(jù)庫(kù)一秒最多抗2000個(gè)請(qǐng)求,如果DBA重啟數(shù)據(jù)庫(kù),立馬又會(huì)被新的請(qǐng)求打死了,這就是緩存雪崩。

 [[317484]]

緩存雪崩

出現(xiàn)過(guò)程

假設(shè)有如下一個(gè)系統(tǒng),高峰期請(qǐng)求為5000次/秒,4000次走了緩存,只有1000次落到了數(shù)據(jù)庫(kù)上,數(shù)據(jù)庫(kù)每秒1000的并發(fā)是一個(gè)正常的指標(biāo),完全可以正常工作,但如果緩存宕機(jī)了,或者緩存設(shè)置了相同的過(guò)期時(shí)間,導(dǎo)致緩存在同一時(shí)刻同時(shí)失效,每秒5000次的請(qǐng)求會(huì)全部落到數(shù)據(jù)庫(kù)上,數(shù)據(jù)庫(kù)立馬就死掉了,因?yàn)閿?shù)據(jù)庫(kù)一秒最多抗2000個(gè)請(qǐng)求,如果DBA重啟數(shù)據(jù)庫(kù),立馬又會(huì)被新的請(qǐng)求打死了,這就是緩存雪崩。

 

 

 

 

 

解決方法

  1. 事前:redis高可用,主從+哨兵,redis cluster,避免全盤(pán)崩潰
  2. 事中:本地ehcache緩存 + hystrix限流&降級(jí),避免MySQL被打死
  3. 事后:redis持久化RDB+AOF,快速恢復(fù)緩存數(shù)據(jù)
  4. 緩存的失效時(shí)間設(shè)置為隨機(jī)值,避免同時(shí)失效

緩存穿透

出現(xiàn)過(guò)程

假如客戶(hù)端每秒發(fā)送5000個(gè)請(qǐng)求,其中4000個(gè)為黑客的惡意攻擊,即在數(shù)據(jù)庫(kù)中也查不到。舉個(gè)例子,用戶(hù)id為正數(shù),黑客構(gòu)造的用戶(hù)id為負(fù)數(shù),如果黑客每秒一直發(fā)送這4000個(gè)請(qǐng)求,緩存就不起作用,數(shù)據(jù)庫(kù)也很快被打死。

 

 

 

 

 

解決方法

  1. 對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),不合理直接返回
  2. 查詢(xún)不到的數(shù)據(jù)也放到緩存,value為空,如 set -999 ""
  3. 使用布隆過(guò)濾器,快速判斷key是否在數(shù)據(jù)庫(kù)中存在,不存在直接返回

緩存擊穿

出現(xiàn)過(guò)程

設(shè)置了過(guò)期時(shí)間的key,承載著高并發(fā),是一種熱點(diǎn)數(shù)據(jù)。從這個(gè)key過(guò)期到重新從MySQL加載數(shù)據(jù)放到緩存的一段時(shí)間,大量的請(qǐng)求有可能把數(shù)據(jù)庫(kù)打死。緩存雪崩是指大量緩存失效,緩存擊穿是指熱點(diǎn)數(shù)據(jù)的緩存失效

解決方法

  1. 設(shè)置key永遠(yuǎn)不過(guò)期,或者快過(guò)期時(shí),通過(guò)另一個(gè)異步線(xiàn)程重新設(shè)置key
  2. 當(dāng)從緩存拿到的數(shù)據(jù)為null,重新從數(shù)據(jù)庫(kù)加載數(shù)據(jù)的過(guò)程上鎖,下面寫(xiě)個(gè)分布式鎖實(shí)現(xiàn)的demo

Redis實(shí)現(xiàn)分布式鎖

我之前的文章寫(xiě)到了Redis實(shí)現(xiàn)分布式鎖的原理,這里就不再詳細(xì)概述了

在Redis中使用簡(jiǎn)單強(qiáng)大的Lua腳本

1.加鎖執(zhí)行命令

 

  1. SET resource_name random_value NX PX 30000 

2.解鎖執(zhí)行腳本

 

  1. if redis.call("get", KEYS[1]) == ARGV[1] then  
  2.     return redis.call("del", KEYS[1])  
  3. else  
  4.     return 0  
  5. end 

寫(xiě)一個(gè)分布式鎖工具類(lèi)

 

  1. public class LockUtil { 
  2.  
  3.     private static final String OK = "OK"
  4.     private static final Long LONG_ONE = 1L; 
  5.     private static final String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"
  6.  
  7.     public static boolean tryLock(String key, String value, long expire) { 
  8.         Jedis jedis = RedisPool.getJedis(); 
  9.         SetParams setParams = new SetParams(); 
  10.         setParams.nx().px(expire); 
  11.         return OK.equals(jedis.set(key, value, setParams)); 
  12.     } 
  13.  
  14.     public static boolean releaseLock(String key, String value) { 
  15.         Jedis jedis = RedisPool.getJedis(); 
  16.         return LONG_ONE.equals(jedis.eval(script, 1, key, value)); 
  17.     } 

工具類(lèi)寫(xiě)起來(lái)還是挺簡(jiǎn)單的

示例代碼

 

  1. public String getData(String key) { 
  2.     String lockKey = "key"
  3.     String lockValue = String.valueOf(System.currentTimeMillis()); 
  4.     long expireTime = 1000L; 
  5.     String value = getFromRedis(key); 
  6.     if (value == null) { 
  7.         if (LockUtil.tryLock(lockKey, lockValue, expireTime)) { 
  8.             // 從數(shù)據(jù)庫(kù)取值并放到redis中 
  9.             LockUtil.releaseLock(lockKey, lockValue); 
  10.         } else { 
  11.             // sleep一段時(shí)間再?gòu)木彺嬷心?nbsp;
  12.             Thread.sleep(100); 
  13.             getFromRedis(key); 
  14.         } 
  15.     } 
  16.     return value; 

 

責(zé)任編輯:武曉燕 來(lái)源: Java識(shí)堂
相關(guān)推薦

2023-11-10 14:58:03

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2019-10-12 14:19:05

Redis數(shù)據(jù)庫(kù)緩存

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫(kù)

2019-11-05 14:24:31

緩存雪崩框架

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2020-03-16 14:57:24

Redis面試雪崩

2022-05-27 07:57:20

緩存穿透緩存雪崩緩存擊穿

2022-11-18 14:34:28

2023-04-14 07:34:19

2023-10-13 08:11:22

2024-03-12 10:44:42

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2023-12-06 13:38:00

Redis緩存穿透緩存擊穿

2020-10-13 07:44:40

緩存雪崩 穿透

2020-10-23 10:46:03

緩存雪崩擊穿

2022-07-11 07:36:36

緩存緩存雪崩緩存擊穿

2020-12-28 12:37:36

緩存擊穿穿透

2023-01-18 07:48:32

緩存穿透緩存擊穿redis

2024-07-12 08:48:50

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 狠狠干在线 | 国产一区二区三区四区五区3d | 国产日韩欧美一区二区 | 精品欧美一区二区精品久久久 | 日韩欧美国产精品 | 日韩在线小视频 | 国产超碰人人爽人人做人人爱 | 日日躁狠狠躁aaaaxxxx | 香蕉一区 | 午夜一区二区三区视频 | 久久不卡区 | h片在线观看网站 | 国产高清免费在线 | 亚洲第一在线 | 婷婷福利视频导航 | 国产一区二区三区在线看 | 亚洲欧美在线视频 | 精品日韩在线 | 久久一区二区免费视频 | 久久精品日 | 91免费在线看| 韩日视频在线观看 | 国产成人精品久久二区二区91 | 精品成人佐山爱一区二区 | 欧美高清性xxxxhdvideosex | 国产精品一区二区三级 | 日韩视频免费 | 精品在线免费看 | 国产精品视频999 | 在线日韩| 中日av| 色视频网站| 欧美在线视频观看 | 日韩精品二区 | 久久久久一区 | 午夜精品久久久久久 | 久久国产精品一区二区三区 | 国产日韩在线观看一区 | 国产精品久久国产精品久久 | 国产专区在线 | 欧美在线天堂 |