Maison  >  Article  >  cadre php  >  Comment résoudre le problème de pénétration du cache en utilisant le verrouillage Redis dans Laravel

Comment résoudre le problème de pénétration du cache en utilisant le verrouillage Redis dans Laravel

藏色散人
藏色散人avant
2020-09-14 09:37:103621parcourir
Ce qui suit est introduit par

Laravel La colonne du didacticiel présentera à tout le monde comment utiliser les verrous Redis pour résoudre la rupture de cache dans Laravel. amis dans le besoin !

Comment résoudre le problème de pénétration du cache en utilisant le verrouillage Redis dans Laravel

La panne de cache est un problème qui peut être rencontré lors du développement :


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()

Exemple d'utilisation :

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer