La panne de cache signifie qu'il n'y a pas de cache mais une base de données. Il y a des données dans le cache (généralement lorsque la durée du cache expire). À ce moment-là, en raison du grand nombre d'utilisateurs simultanés, les données ne sont pas lues dans le cache en même temps et les données sont extraites de la base de données en même temps. en même temps, provoquant une augmentation instantanée de la pression sur la base de données, provoquant une pression excessive.Le verrouillage Redis est un bon moyen de résoudre le problème de panne de cache. Laravel 7 est livré avec la classe de verrouillage
Redis, qui peut être utilisée directement et est très pratique à utiliser. Le constructeur de IlluminateCacheRedisLock
est le suivant : RedisLock
/** * @param \Illuminate\Redis\Connections\Connection $redis redis实例 * @param string $name redis锁的键名 * @param int $seconds redis锁的失效时间 * @param string|null $owner redis锁的值,如果不设置或者为null,基类会将其设置为随机字符串 */public function __construct($redis, $name, $seconds, $owner = null){ parent::__construct($name, $seconds, $owner); $this->redis = $redis;}Dans cette classe, utilisez la méthode
pour obtenir un verrou Redis mutuellement exclusif, et utilisez la méthode acquire()
pour libérer la serrure. release()
use Illuminate\Support\Facades\Redis;use Illuminate\Cache\RedisLock;
function RedisLockTest(){ //获取redis实例 $redis = Redis::connection(); $key = 'redis_test_key'; //获取redis锁实例 $redisLock = new RedisLock($redis, $key . '_lock', 30); $res = $redis->get($key); if (empty($res)) { //拿到互斥锁 if ($redisLock->acquire()) { //模拟从数据库中获取数据的过程 sleep(5); $value = date('Y-m-d H:i:s'); //更新缓存,过期时间可以根据实际情况调整 $redis->setex($key, 60, $value); //释放锁 $redisLock->release(); return $value; } else { //等待2秒,然后重新获取缓存值,让其他获取到锁的进程取得数据并设置缓存,等待时间可以根据实际情况调整 sleep(2); return $this->RedisLockTest(); } } else { return $res; }}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!