1.缓存雪崩
缓存中大量数据同时过期。查询数据量大。导致缓存数据库服务器压力过大。甚至宕机
解决方案:
1.1 过期时间设置随机。避免大量数据同时过期
1.2 如果是分布式部署。将热点数据分布在不同的缓存数据库中
1.3 热点数据可以设置永不过期
2.缓存穿透
缓存和数据库中都不存在的数据。用户不断的访问不存在的数据。导致数据库压力过大
解决方案:
2.1 增加鉴权。用户访问限制。一段时间内访问次数限制等
2.2 将不存在的数据也进行缓存。缓存时间可以设置短一些
2.3 布隆过滤器。将所有可能存在的数据哈希到一个大的集合中。不存在的数据会被拦截
3.缓存击穿
缓存击穿是并发用户同时访问同一数据。缓存中没有或过期。瞬时访问压力集中在查询数据库。导致数据库压力瞬时增大
解决方案:
3.1 设置热点数据永不过期
3.2 利用互斥锁。exp:
protected function getData()
{
$ret = $this->getRedis($key);
if ($ret == null) {
try {
if (lock.get) {
$ret = $this->getMysql($key);
if ($ret != null) {
$this->setRedis($key, $ret);
}
}
} catch {
lock.unlock;
}
}
return $ret;
}
缓存热点key
缓存中的一个Key。在某个时间点过期的时候。恰好在这个时间点对这个Key有大量的并发请求。缓存过期会从数据库查询数据并设置缓存。此时并发的请求可能会瞬间把数据库压垮
解决方案
对缓存查询加锁。如果KEY不存在。就加锁。然后查DB入缓存。然后解锁;其他进程如果发现有锁就等待。然后等解锁后返回数据或者进入DB查询。
本文地址:https://gpu.xuandashi.com/8875.html,转载请说明来源于:渲大师
声明:本站部分内容来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。分享目的仅供大家学习与参考,不代表本站立场!