在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题

104次阅读
没有评论

共计 2845 个字符,预计需要花费 8 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍了如何解决 redis 缓存穿透、缓存击穿、缓存雪崩的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

缓存穿透:key 中对应的缓存数据不存在,导致去请求数据库,造成数据库的压力倍增的情况

缓存击穿:redis 过期后的一瞬间,有大量用户请求同一个缓存数据,导致这些请求都去请求数据库,造成数据库压力倍增的情,针对一个 key 而言

缓存雪崩:缓存服务器宕机或者大量缓存集中某个时间段失效,导致请求全部去到数据库,造成数据库压力倍增的情况,这个是针对多个 key 而言

一、缓存穿透的解决方案

常用方法可以采用布隆过滤器方法进行数据拦截,其次可以还有一种解决思路,就是如果请求的数据为空,将空值也进行缓存,就不会发生穿透情况

?php
class getPrizeList {
 /**
 * redis 实例
 * @var \Redis
 */
 private $redis;
 /**
 * @var string
 */
 private $redis_key =  |prize_list 
 /**
 *  过期时间
 * @var int
 */
 private $expire = 30;
 /**
 * getPrizeList constructor.
 * @param $redis
 */
 public function __construct($redis)
 {
 $this- redis = $redis;
 }
 /**
 * @return array|bool|string
 */
 public function fetch()
 { $result = $this- redis- get($this- redis_key);
 if(!isset($result)) {
 // 此处应该进行数据库查询...
 // 如果查询结果不存在,给其默认空数组进行缓存
 $result = [];
 $this- redis- set($this- redis_key, $result, $this- expire);
 }
 return $result;
 }
}

二、缓存击穿解决办法

使用互斥锁 (mutex key), 就是一个 key 过期时,多个请求过来允许其中一个请求去操作数据库,其他请求等待第一个请求成功返回结果后再请求。

?php
class getPrizeList {
 /**
 * redis 实例
 * @var \Redis
 */
 private $redis;
 /**
 * @var string
 */
 private $redis_key =  |prize_list 
 /**
 * @var string
 */
 private $setnx_key =  |prize_list_setnx 
 /**
 *  过期时间
 * @var int
 */
 private $expire = 30;
 /**
 * getPrizeList constructor.
 * @param $redis
 */
 public function __construct($redis)
 {
 $this- redis = $redis;
 }
 /**
 * @return array|bool|string
 */
 public function fetch()
 { $result = $this- redis- get($this- redis_key);
 if(!isset($result)) { if($this- redis- setnx($this- setnx_key, 1, $this- expire)) {
 // 此处应该进行数据库查询...
 //$result =  数据库查询结果;
 $this- redis- set($this- redis_key, $result, $this- expire);
 $this- redis- del($this- setnx_key); // 删除互斥锁
 } else {
 // 其他请求每等待 10 毫秒重新请求一次
 sleep(10);
 self::fetch();
 }
 }
 return $result;
 }
}

三、缓存雪崩的解决办法

这种情况是因为多个 key 同时过期导致的数据库压力,一种方法可以在 key 过期时间基础上增加时间随机数,让过期时间分散开,减少缓存时间过期的重复率

另一种方法就是加锁排队,这种有点像上面缓存击穿的解决方式,但是这种请求量太大,比如 5000 个请求过来,4999 个都需要等待,这必然是指标不治本,不仅用户体验性差,分布式环境下就更加复杂,因此在高并发场景下很少使用

最好的解决方法,是使用缓存标记,判断该标记是否过期,过期则去请求数据库,而缓存数据的过期时间要设置的比缓存标记的长,这样当一个请求去操作数据库的时候,其他请求拿的是上一次缓存数据

?php
class getPrizeList {
 /**
 * redis 实例
 * @var \Redis
 */
 private $redis;
 /**
 * @var string
 */
 private $redis_key =  |prize_list 
 /**
 *  缓存标记 key
 * @var string
 */
 private $cash_key =  |prize_list_cash 
 /**
 *  过期时间
 * @var int
 */
 private $expire = 30;
 /**
 * getPrizeList constructor.
 * @param $redis
 */
 public function __construct($redis)
 {
 $this- redis = $redis;
 }
 /**
 * @return array|bool|string
 */
 public function fetch()
 { $cash_result = $this- redis- get($this- cash_key);
 $result = $this- redis- get($this- redis_key);
 if(!$cash_result) { $this- redis- set($this- cash_key, 1, $this- expire);
 // 此处应该进行数据库查询...
 //$result =  数据库查询结果,  并且设置的时间要比 cash_key 长,这里设置为 2 倍;
 $this- redis- set($this- redis_key, $result, $this- expire * 2);
 }
 return $result;
 }
}

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“如何解决 redis 缓存穿透、缓存击穿、缓存雪崩的问题”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2845字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 黄色免费一级播放片 | 91精品久久久久久久久久小网站 | 日韩中文字幕久久精品 | 日韩欧美国产一区精品 | a级黄色视屏 | 久久精品91佛爷大战美容院 | 又爽又黄又无遮挡的激情视频 | 在线观看日韩一区 | 欧美一级特级毛片 | 色播欧美 | 无码人妻精品一区二区三区9厂 | 法国少妇xxxx做受 | 日韩精品中文字幕一区二区三区 | 男人天堂一区 | 日本人亚洲人jizz | 亚色中文 | 国产一级爱片在线播放 | 亚洲av极品视觉盛宴 | 国产情侣一区二区 | 国产成人精品曰本亚洲77美色 | 中国老熟妇自拍hd发布 | 免费观看男男污污ww网站 | 国产亚洲成av人片在线观看 | 巨骚综合网 | 国产高清在线精品免费 | 国产一久久香蕉国产线看观看 | 最新亚洲人成网站在线影院 | 国产亚洲美女精品久久久2020 | 久久久亚洲av波多野结衣 | 国产精品在线播放 | 国产在线观看精品一区二区三区 | 亚洲精品高清视频 | 福利视频在线观看www. | 久久精品国产精品亚洲色婷婷 | 激情综合亚洲五月色婷婷 | 毛片黄片 | 欧美一区二区三区大片 | 中文字幕欧美人妻精品一区 | 日韩大片在线永久免费观看网站 | 国产成人免费a在线资源 | 2020亚洲男人天堂 |