最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php 使用redis鎖限制并發(fā)訪問類示例

 更新時(shí)間:2016年11月02日 16:40:30   作者:傲雪星楓  
本篇文章主要介紹了php 使用redis鎖限制并發(fā)訪問類,可以限制用戶請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

本文介紹了php 使用redis鎖限制并發(fā)訪問類,并詳細(xì)的介紹了并發(fā)訪問限制方法。

1.并發(fā)訪問限制問題

對(duì)于一些需要限制同一個(gè)用戶并發(fā)訪問的場(chǎng)景,如果用戶并發(fā)請(qǐng)求多次,而服務(wù)器處理沒有加鎖限制,用戶則可以多次請(qǐng)求成功。

例如換領(lǐng)優(yōu)惠券,如果用戶同一時(shí)間并發(fā)提交換領(lǐng)碼,在沒有加鎖限制的情況下,用戶則可以使用同一個(gè)換領(lǐng)碼同時(shí)兌換到多張優(yōu)惠券。

偽代碼如下:

if A(可以換領(lǐng))
    B(執(zhí)行換領(lǐng))
    C(更新為已換領(lǐng))
D(結(jié)束)

如果用戶并發(fā)提交換領(lǐng)碼,都能通過可以換領(lǐng)(A)的判斷,因?yàn)楸仨氂幸粋€(gè)執(zhí)行換領(lǐng)(B)后,才會(huì)更新為已換領(lǐng)(C)。因此如果用戶在有一個(gè)更新為已換領(lǐng)之前,有多少次請(qǐng)求,這些請(qǐng)求都可以執(zhí)行成功。

2.并發(fā)訪問限制方法

使用文件鎖可以實(shí)現(xiàn)并發(fā)訪問限制,但對(duì)于分布式架構(gòu)的環(huán)境,使用文件鎖不能保證多臺(tái)服務(wù)器的并發(fā)訪問限制。

Redis是一個(gè)開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。

本文將使用其setnx方法實(shí)現(xiàn)分布式鎖功能。setnx即Set it N**ot eX**ists。

當(dāng)鍵值不存在時(shí),插入成功(獲取鎖成功),如果鍵值已經(jīng)存在,則插入失?。ǐ@取鎖失?。?/p>

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連接設(shè)定
   */
  public function __construct($config=array()){
    $this->_config = $config;
    $this->_redis = $this->connect();
  }

  /**
   * 獲取鎖
   * @param String $key  鎖標(biāo)識(shí)
   * @param Int   $expire 鎖過期時(shí)間
   * @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 鎖標(biāo)識(shí)
   * @return Boolean
   */
  public function unlock($key){
    return $this->_redis->del($key);
  }

  /**
   * 創(chuàng)建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,
);

// 創(chuàng)建redislock對(duì)象
$oRedisLock = new RedisLock($config);

// 定義鎖標(biāo)識(shí)
$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>';
}

?>

測(cè)試方法:

打開兩個(gè)不同的瀏覽器,同時(shí)在A,B中訪問demo.php

如果先訪問的會(huì)獲取到鎖

輸出

get lock success
do sth..
success

另一個(gè)獲取鎖失敗則會(huì)輸出request too frequently

保證同一時(shí)間只有一個(gè)訪問有效,有效限制并發(fā)訪問。

為了避免系統(tǒng)突然出錯(cuò)導(dǎo)致死鎖,所以在獲取鎖的時(shí)候增加一個(gè)過期時(shí)間,如果已超過過期時(shí)間,即使是鎖定狀態(tài)都會(huì)釋放鎖,避免死鎖導(dǎo)致的問題。
源碼下載地址:點(diǎn)擊查看

相關(guān)文章

  • PHP獲取表單所有復(fù)選框的值的方法

    PHP獲取表單所有復(fù)選框的值的方法

    這篇文章主要介紹了PHP獲取表單所有復(fù)選框的值的方法,是進(jìn)行PHP程序設(shè)計(jì)表單操作中所必須掌握的常用技巧,需要的朋友可以參考下
    2014-08-08
  • PHP循環(huán)與分支知識(shí)點(diǎn)梳理

    PHP循環(huán)與分支知識(shí)點(diǎn)梳理

    涉及到一些比較復(fù)雜的邏輯,分支與循環(huán)是必不可少的。通過分支和循環(huán)的結(jié)合使用可以使業(yè)務(wù)更加復(fù)雜,代碼功能更加強(qiáng)大,這篇文章主要介紹了PHP循環(huán)與分支知識(shí)點(diǎn)
    2022-11-11
  • PHP常用函數(shù)和常見疑難問題解答

    PHP常用函數(shù)和常見疑難問題解答

    雖然PHP在整體功能上不如Java強(qiáng)大,但相比PHP而言Java算是較重量級(jí)的,所以在小中型系統(tǒng)的開發(fā)上,使用PHP的趨勢(shì)不可擋,就算是大型網(wǎng)站,比如淘寶也部分使用了PHP(Java后臺(tái)邏輯+PHP前臺(tái)展示),所以趕緊開始學(xué)PHP啦
    2014-03-03
  • ThinkPHP like模糊查詢,like多匹配查詢,between查詢,in查詢,一般查詢書寫方法

    ThinkPHP like模糊查詢,like多匹配查詢,between查詢,in查詢,一般查詢書寫方法

    ThinkPHP的數(shù)據(jù)庫條件查詢語句有字符串式,數(shù)組式書寫方法,字符串式即是原生式而數(shù)組式的查詢語句因書寫方式與特定字符的原因比較復(fù)雜,今天為大家講解一下ThinkPHP數(shù)組式查詢語句的書寫方法
    2018-09-09
  • php根據(jù)用戶名和手機(jī)號(hào)查詢是否存在手機(jī)號(hào)碼

    php根據(jù)用戶名和手機(jī)號(hào)查詢是否存在手機(jī)號(hào)碼

    本文主要分享了php根據(jù)用戶名和手機(jī)號(hào)查詢是否存在手機(jī)號(hào)碼的代碼,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • php實(shí)現(xiàn)將數(shù)組轉(zhuǎn)換為XML的方法

    php實(shí)現(xiàn)將數(shù)組轉(zhuǎn)換為XML的方法

    這篇文章主要介紹了php實(shí)現(xiàn)將數(shù)組轉(zhuǎn)換為XML的方法,實(shí)例分析了php操作數(shù)組及XML格式文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • win2003服務(wù)器使用WPS的COM組件的一些問題解決方法

    win2003服務(wù)器使用WPS的COM組件的一些問題解決方法

    項(xiàng)目中使用了新功能,gump同學(xué)研究出來的使用WPS的COM組件用PHP實(shí)現(xiàn)將doc等office格式轉(zhuǎn)換成pdf
    2012-01-01
  • PHP解壓tar.gz格式文件的方法

    PHP解壓tar.gz格式文件的方法

    這篇文章主要介紹了PHP解壓tar.gz格式文件的方法,較為詳細(xì)的介紹了PHP安裝pear擴(kuò)展及解壓tar.gz格式文件的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-02-02
  • PHP新特性詳解之命名空間、性狀與生成器

    PHP新特性詳解之命名空間、性狀與生成器

    這篇文章主要給大家介紹了關(guān)于PHP新特性之命名空間、性狀與生成器的相關(guān)資料,主要涉及到php中trait(性狀)與generator(生成器) 方面的內(nèi)容,對(duì)于php中trait(性狀)與generator(生成器) 感興趣的同學(xué)可以參考一下。
    2017-07-07
  • 使用PHP函數(shù)進(jìn)行網(wǎng)站性能監(jiān)控和優(yōu)化的代碼示例

    使用PHP函數(shù)進(jìn)行網(wǎng)站性能監(jiān)控和優(yōu)化的代碼示例

    在 PHP 中,有許多內(nèi)置函數(shù)和工具可以幫助我們實(shí)現(xiàn)網(wǎng)站的性能監(jiān)控和優(yōu)化,本文將介紹幾種常用的 PHP 函數(shù),并提供相應(yīng)的代碼示例,來幫助您更好地進(jìn)行網(wǎng)站性能監(jiān)控和優(yōu)化,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

湛江市| 门源| 红河县| 西丰县| 江西省| 宁河县| 渭源县| 沅江市| 肇东市| 门头沟区| 凌云县| 高密市| 沙田区| 祥云县| 河西区| 日喀则市| 福鼎市| 辰溪县| 大名县| 汪清县| 怀化市| 吉木萨尔县| 上杭县| 临朐县| 成武县| 石柱| 和政县| 阿拉善右旗| 乐安县| 当雄县| 昌平区| 湖南省| 佳木斯市| 灵武市| 西安市| 伊宁县| 澜沧| 航空| 视频| 咸宁市| 丰顺县|