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: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()< /code> gibt die Sperre frei. <code>IlluminateCacheRedisLock
Redis锁类,直接使用就行,用起来也很方便。
RedisLock
的构造函数如下:
use Illuminate\Support\Facades\Redis;use Illuminate\Cache\RedisLock;
在这个类中,使用 acquire()
方法获得互斥的Redis锁,使用 release()
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; }}
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!