Heim >PHP-Framework >Laravel >So lösen Sie das Problem der Cache-Penetration mithilfe der Redis-Sperre in Laravel

So lösen Sie das Problem der Cache-Penetration mithilfe der Redis-Sperre in Laravel

藏色散人
藏色散人nach vorne
2020-09-14 09:37:103829Durchsuche

vorgestellt, um die Verwendung von Redis-Sperren in Laravel zur Lösung des Problems des Cache-Ausfalls vorzustellen. Ich hoffe, es wird Freunden in Not hilfreich sein!

Cache-Aufschlüsselung ist ein Problem, das während der Entwicklung auftreten kann:

So lösen Sie das Problem der Cache-Penetration mithilfe der Redis-Sperre in Laravel

Cache-Aufschlüsselung bezieht sich auf Daten, die sich nicht im Cache, sondern in der Datenbank befinden (normalerweise ist die Cache-Zeit zu diesem Zeitpunkt abgelaufen). aufgrund gleichzeitiger Benutzer Es gibt so viele, dass die Daten nicht gleichzeitig im Cache gelesen werden und die Daten gleichzeitig aus der Datenbank abgerufen werden, was dazu führt, dass der Druck auf die Datenbank sofort zunimmt und übermäßigen Druck verursacht.

Redis-Sperre ist eine gute Möglichkeit, das Problem der Cache-Aufschlüsselung zu lösen.

Laravel 7 wird mit der Redis-Sperrklasse IlluminateCacheRedisLock geliefert, die direkt verwendet werden kann und sehr bequem zu verwenden ist. Der Konstruktor von

RedisLock lautet wie folgt:

/**
 * @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;}

Verwenden Sie in dieser Klasse die Methode acquire(), um eine sich gegenseitig ausschließende Redis-Sperre zu erhalten, und verwenden Sie Die Methode release() gibt die Sperre frei. <code>IlluminateCacheRedisLock Redis锁类,直接使用就行,用起来也很方便。

RedisLock 的构造函数如下:

use Illuminate\Support\Facades\Redis;use Illuminate\Cache\RedisLock;

在这个类中,使用 acquire() 方法获得互斥的Redis锁,使用 release()

Anwendungsbeispiel:

function RedisLockTest(){
    //获取redis实例
    $redis = Redis::connection();
    $key = &#39;redis_test_key&#39;;
    //获取redis锁实例
    $redisLock = new RedisLock($redis, $key . &#39;_lock&#39;, 30);
    $res = $redis->get($key);
    if (empty($res)) {
        //拿到互斥锁
        if ($redisLock->acquire()) {
            //模拟从数据库中获取数据的过程
            sleep(5);
            $value = date(&#39;Y-m-d H:i:s&#39;);
            //更新缓存,过期时间可以根据实际情况调整
            $redis->setex($key, 60, $value);
            //释放锁
            $redisLock->release();
            return $value;
        } else {
            //等待2秒,然后重新获取缓存值,让其他获取到锁的进程取得数据并设置缓存,等待时间可以根据实际情况调整
            sleep(2);
            return $this->RedisLockTest();
        }
    } else {
        return $res;
    }}
rrree

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Cache-Penetration mithilfe der Redis-Sperre in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen