北京赛车 pk10开奖记录_Toyou热购彩票官网
帮助文档Help

php 使用redis锁限制并发访问类示例

一佰互联网站制作(www.yinxi.net) 发布日期 2019-04-26 09:03:49 浏览数: 198

本文介绍了php 使用redis锁限制并发访问类崎,并详细的介绍了并发访问限制方法恃。

1.并发访问限制问题

对于一些需要限制同一个用户并发访问的场景想塘垒,如果用户并发请求多次档殿蛊,而服务器处理没pk10开奖 “碰上活该。”罗敏敏:“你说吧。”有加锁限制频棘卢,用户则可以多次请求成功燎。

例如换领优惠券侨案破,如果用户同一时间并发提交换领码琼,在没有加锁限制的情况下刮盟激,用户则可以使用同一个换北京赛车2.桃仁牛奶芝麻糊我惊奇地看着它。领码同时兑换到多张优惠券妒芯妓。

伪代码如下敖娩:

if A(可以换领)
    B(执行换领)
    C(更新为已换领)
D(结束)

如果用户并发提交换领码殊店,都能通过可以换领(A)的判断偷染堑,因为必须有一个执行换领(B)后孺罢钠,才会更新为已换领(C)供垢烙。因此如果用户在有一个更新为已换领之前摧伺,有多少次请求末绍横,这些请求都可以执行成功贯。

2.并发访问限制方法

使用文件锁可以实现并发访问限制忍肉颓,但对于分布式架构的环境崩睫,使用文件锁不能保证多台服务器的并发访问限制揉观驾。

Redis是一个开源的使用ANSI C语言编写跨煽吓、支持网络省污、可基于内存亦可持久化的日志型勺创、Key-Value数据库喂镣,并提供多种语言的API皆。

本文将使用其setnx方法实现分布式锁功能袖夯浩。setnx即Set it N**ot eX**ists堑讨悍。

当键值不热购彩票 兵败宁远及悲剧之因PART B10 靳可存在时拣殊喝,插入成功(获取锁成功)乐,如果键值已经存在衡艰急,则插入失败(获取锁失败)

RedisLock.class.PHP

<?php
/**
 * Redis锁操作类
 * Date:  2016-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>";
}

?>

测试方法精谷挥:

打开两个不同的浏览器,同时在A,B中访问demo.php

如果先访问的会获取到锁

输出

get lock success
do sth..
success

另一个获取锁失败则会输出request too frequently

保证同一时间只有一个访问有效扮壳邦,有效限制并发访问艰。

为了避免系统突然出错导致死锁捆奸妊,所以在获取锁的时候增加一个过期时间焊窃泵,如果已超过过期时间陀纠,即使是锁定状态都会释放锁臀惩,避免死锁导致的问题撼。
源码下载地址疗瓢钞:点击查看

TAG标签恳牌梢: php   使用redis锁限制并发访问类示例  
一佰互联是全国知名建站品牌服务商,我们有九年网站建设射睹、网站制作啡泵、网页设计屉朔搁、php开发和域名注册及虚拟主机服务经验篇,提供的自助建站服务更是全国有名蓖挖。近年来还整合团队优势自主开发了可视化多用户”巅云建站系统“3.0平台版典,拖拽排版网站制作设计谰,轻松实现pc站匪、手机微网站勒泉骗、小程序淘抡磊、APP一体化全网营销网站建设 赌,已成功的为全国上百家网络公司提供自助建站平台搭建服务甲窃秸。

相关新闻more

27
03月
jQuery中的$是什么意思及 $. 和 $

简介炒簇蓬:$就是jQuery的别称而jQuery就是jQuery库提供的一个函数.(好像也不仅仅只是函数炭, 因为还有 $.ajax(option... >>详情

15
04月
重庆网站设计遍淘,网站设计目录的作用和重要性

你在网络上做生意因为你想获得成功卢痴谁,对不对?为了达到重庆网站设计这个目的慷戮夺,作为网站的拥有者临,跟你的网站设计者一起魂娟,要做更好地工作来获得更多的链... >>详情

27
03月
像电影里黑客高手一样敲代码攻击入侵网站!屌到

简介绩:我们常常会在一些好莱坞电影大片里看到超级黑客高手疚录,在电脑前轻松“黑”进别人的安全系统的场景凳。那纯熟自如地输入一大堆复杂的代码靶绣,不一下子... >>详情

09
04月
用腾讯高手的交互自查表权署,快速搞定设计中的分支

本文作者结合自身经验就烷晌,总结了一份交互自查表揭胁监,来帮助大家在工作中面对分支流程和异常情况的时候改票,提高处理效率衔麻池。先来看一个比较老的梗购,把大象装进冰... >>详情

高端网站建设

美工兼顾SEO埠残,为企业电子商务营销助力!

电话码才朵:

023-85725751
建站

产品

域名注册 虚拟主机 云服务器 企业邮局
智能建站 APP打包 微站/小程序 创业平台
网站推广 媒体营销 智能采集 AI机器人
400电话 短信营销 店销机器人
私人定制 门户网站
热购彩票