美文网首页
PHP Redis实现同步锁

PHP Redis实现同步锁

作者: 江河湖海琴瑟琵琶 | 来源:发表于2020-11-24 14:44 被阅读0次

接上文同步锁(用文件实现)
用文件的形式实现同步锁,需要对应目录有读写权限,有IO性能消耗,而且会生成残留文件, 其实也可以借助redis达到同样的效果
Redis是线程安全的,可以把Redis看成单线程的模型.

首先来看Redisset命令

原生命令如下
set key value [EX seconds] [PX milliseconds] [NX|XX]
参数说明
*key 
*value
*[EX seconds] 可选,过期时间 单位秒
*[PX milliseconds] 可选,过期时间 单位毫秒
*[NX|XX] 可选,NX表示key不存在时执行set命令
              XX表示key存在时执行set命令

来个例子实验一下

设置name->zhangsan
过期时间20秒,且内存中不存在名为name的key时,命令执行
127.0.0.1:6379> set name zhangsan EX 20 NX 

执行两遍相同命令,只有第一条返回OK

image.png

PHP实现

用composer 下载Redis三方包,不同的包操作可能会有些差异.
我用的是Predis

<?php
namespace lock;
require_once 'lib/vendor/autoload.php';
use \Predis\Client;
class RedisLock
{
    private $client;
    private $key;
    /**
     * RedisLock constructor.
     *
     * @param $key
     */
    public function __construct ($key) {
        \Predis\Autoloader::register();
        $client = new Client([
            'scheme' => 'tcp',
            'host'   => '127.0.0.1',
            'port'   => 6379,
        ]);
        $this->client = $client;
        $this->key    = $key;
    }
    /**
     * 获取锁
     * 
     * @return mixed
     */
    function getLock(){
        return $this->client->set($this->key,1,'EX',10,'NX');
    }
    /**
     * 清除锁
     */
    function clearLock(){
        $this->client->del($this->key);
    }
}

测试

<?php
use lock\RedisLock;
require_once 'RedisLock.php';

if (!isset($argv[1])){
    echo '输入cacheKey';
    return;
}
//获取输入的cacheKey
$cacheKey = $argv[1];

$redisLock = new RedisLock($cacheKey);
if($redisLock->getLock())
{
    echo "读库-$cacheKey".PHP_EOL;
    sleep(60);
    //TODO 设置缓存
    $redisLock->clearLock();
}else{
    echo "获取锁失败$cacheKey";
}
效果 image.png
image.png

确保只有一个线程进入读取数据库的代码段.就能避免缓存击穿问题.

相关文章

  • PHP Redis实现同步锁

    接上文同步锁(用文件实现)[https://www.jianshu.com/p/0a5f5c7ff9eb]用文件的...

  • 秒杀随笔

    方法: mysql悲观锁 mysql乐观锁 PHP+redis分布式锁 PHP+redis乐观锁(redis wa...

  • Redis 文章转载

    php结合redis/lua实现分布式redis锁 Redis面试题整理-字节头条腾讯面试题 (2020最新版含详...

  • 大佬浅谈分布式锁

    redis 实现 redis 分布锁一、redis 实现分布式锁(可重入锁)redission 实现分布式锁1、对...

  • 协程化redis分布式锁实现

    最近看<> 里面有一个不错的redis分布式锁的实现,但是只是同步实现版本, 由于工作中用pyt...

  • Redis实现分布式锁

    Redis实现分布式锁 一、Redis单节点实现 (一) 获取锁 使用 Redis 客户端获取锁,向Redis发出...

  • Zookeeper实现分布式锁(一)While版

    前面文章讲解了用Redis实现分布式锁的方式: 分布式锁之Redis实现(acquire)分布式锁之Redis实现...

  • 基于redis实现的分布式锁

    本文要点 基于redis实现分布式锁demo 基于redis实现分布式锁原理 基于redis实现分布式锁优缺点 正...

  • Java并发编程艺术(四) Java中的锁

    1、Lock接口 2、队列同步器 同步器是实现锁的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。 同步器是...

  • Java多线程基础-使用多线程(二)

    |-目录|  同步锁  -|同步锁使用范围  -|对象锁与静态锁  -|死锁|  volatile实现’内存共享’...

网友评论

      本文标题:PHP Redis实现同步锁

      本文链接:https://www.haomeiwen.com/subject/sbpiiktx.html