PHP进阶与redis锁限制并发访问功能示例

PHP进阶与redis锁限制并发访问功能示例

<?php
/**
 * Redis锁操作类
 * Date:  2017-06-30
 * Author: fdipzone
 * Ver:  1.0
 *
 * Func:
 * public lock  获取锁
 * public unlock 释放锁
 * private connect 连接
 */
class RedisLock { // class start

  private $_config;
  private $_redis;

  /**
   * 初始化
   * @param Array $config redis连接设定
   */
  public function __construct($config=array()){
    $this->_config = $config;
    $this->_redis = $this->connect();
  }

  /**
   * 获取锁
   * @param String $key  锁标识
   * @param Int   $expire 锁过期时间
   * @return Boolean
   */
  public function lock($key, $expire=5){
    $is_lock = $this->_redis->setnx($key, time()+$expire);

    // 不能获取锁
    if(!$is_lock){

      // 判断锁是否过期
      $lock_time = $this->_redis->get($key);

      // 锁已过期,删除锁,重新获取
      if(time()>$lock_time){
        $this->unlock($key);
        $is_lock = $this->_redis->setnx($key, time()+$expire);
      }
    }

    return $is_lock? true : false;
  }

  /**
   * 释放锁
   * @param String $key 锁标识
   * @return Boolean
   */
  public function unlock($key){
    return $this->_redis->del($key);
  }

  /**
   * 创建redis连接
   * @return Link
   */
  private function connect(){
    try{
      $redis = new Redis();
      $redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']);
      if(empty($this->_config['auth'])){
        $redis->auth($this->_config['auth']);
      }
      $redis->select($this->_config['index']);
    }catch(RedisException $e){
      throw new Exception($e->getMessage());
      return false;
    }
    return $redis;
  }

} // class end

?>

 

 

demo.php

<?php
require 'RedisLock.class.php';

$config = array(
  'host' => 'localhost',
  'port' => 6379,
  'index' => 0,
  'auth' => '',
  'timeout' => 1,
  'reserved' => NULL,
  'retry_interval' => 100,
);

// 创建redislock对象
$oRedisLock = new RedisLock($config);

// 定义锁标识
$key = 'mylock';

// 获取锁
$is_lock = $oRedisLock->lock($key, 10);

if($is_lock){
  echo 'get lock success<br>';
  echo 'do sth..<br>';
  sleep(5);
  echo 'success<br>';
  $oRedisLock->unlock($key);

// 获取锁失败
}else{
  echo 'request too frequently<br>';
}

?>

PHP进阶与redis锁限制并发访问功能示例

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112928.html原文链接:https://javaforall.net

(0)
上一篇 2021年10月27日 下午7:00
下一篇 2021年10月27日 下午8:00


相关推荐

  • vs中没有vc_vs中的控件

    vs中没有vc_vs中的控件#include头文件fstream包含了ifstream、ofstream、fstream三个类,可以通过定义这三个类的对象来实现相对应的文件操作。#includeofstream//文件写操作,内存写入存储设备ifstream//文件读操作,存储设备读取到内存中fstream//读写操作,对打开的文件可进行读写操作1.打开文件函数open()public…

    2025年12月11日
    4
  • 开源项目renren-fast解读(二)

    开源项目renren-fast解读(二)续上集 开源项目 renren fast 解读 让 java 不再难懂 一 3 安全防范模块 预防 xss 攻击和 sql 注入 XSS1 百度百科的解释 XSS 又叫 CSS CrossSiteScr 跨站脚本攻击 它指的是恶意攻击者往 Web 页面里插入恶意 html 代码 当用户浏览该页之时 嵌入其中 Web 里面的 html 代码会被执行 从而达到恶意用户的特殊目的 2 它与 SQL 注入攻

    2026年3月18日
    2
  • linux系统centos7安装nginx

    linux系统centos7安装nginxlinux系统centos7安装nginx,简单亲自测试成功

    2022年5月15日
    37
  • EF框架

    EF框架EF 框架 全称 EntityFramew 即实体框架一 EF 简介 它微软提供的一种 ORM 工具 支持面向数据的软件应用程序的技术 ORM 让开发人员节省数据库访问的代码时间 将更多的时间放到业务逻辑层代码上 EF 提供变更跟踪 唯一性约束 惰性加载 查询事物等 开发人员使用 Linq 语言 对数据库操作如同操作 Object 对象一样省事 那么 ORM 是什么 ORM 对象关系映射 是将数据存储从域对象自动映射到关系型数据库的工具 ORM 主要包括 3 个部分 域对象 关系数据库对象 映射关系 通过使用 ORM 我们

    2026年3月19日
    2
  • uniqueidentifier转换_unique函数哪个版本有

    uniqueidentifier转换_unique函数哪个版本有uniqueidentifier中文含义“唯一的标识符”。uniqueidentifier数据类型是16个字节的二进制值,应具有唯一性,必须与NEWID()函数配合使用。uniqueidentifier数据类型与identity自增不同,不会为插入的新行自动生成新的ID,新值由NEWID()函数指定。NEWID()函数值会生成全球唯一的标识,标识由网卡号和CPU时钟组成,如:6

    2025年10月1日
    9
  • nyvacat for mysql15激活码【注册码】「建议收藏」

    nyvacat for mysql15激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    78

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号