业务常规的查询逻辑如下:
从redis中获取数据, 有则返回
当第一步redis无数据, 去MySQL查询数据
把第二步查询到的数据写入redis
返回数据
问题分析
redis当然不会有问题, 问题是在第二步的时候...去MySQL查询数据,数据库服务已经宕机, 这时候请求阻塞住
阻塞超时,然后抛出异常,导致无法走到第三步
下一次请求来, 又继续去连接MySQL,无限阻塞,把业务服务器也拖垮
解决方案
这是我们的解决方案...当MySQL宕机强制缓存空数据到redis,允许部分页面为空.而不是无法提供服务
解决思路
设置好合理的MySQL连接超时时间
mysqlnd.net_read_timeout = 3
当数据库连接超时之后...php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class BaseModel extends Model
{...try {
return parent::get($columns);
} catch (\Exception $e) {
// 根据 laravel