redisççæ¯ä¸ä¸ªå¾å¥½çææ¯ï¼å®å¯ä»¥å¾å¥½çå¨ä¸å®ç¨åº¦ä¸è§£å³ç½ç«ä¸ç¬é´ç并åéï¼ä¾å¦ååæ¢è´ç§æçæ´»å¨ã
redisä¹æ以è½è§£å³é«å¹¶åçåå æ¯å®å¯ä»¥ç´æ¥è®¿é®å åï¼è以å¾æ们ç¨çæ¯æ°æ®åº(硬ç),æé«äºè®¿é®æç,解å³äºæ°æ®åºæå¡å¨ååã
为ä»ä¹redisçå°ä½è¶æ¥è¶é«ï¼æ们为ä½ä¸éæ©memcacheï¼è¿æ¯å 为memcacheåªè½åå¨å符串ï¼èredisåå¨ç±»åå¾ä¸°å¯ï¼ä¾å¦æå符串ãLISTãSETçï¼ï¼memcacheæ¯ä¸ªå¼æ大åªè½åå¨1M,åå¨èµæºé常æé,ååæ¶èå åèµæºã
èrediså¯ä»¥åå¨1G,æéè¦çæ¯memcacheå®ä¸å¦rediså®å ¨,å½æå¡å¨åçæ éæè æå¤å ³æºçæ åµæ¶,redsiä¼æå åä¸çæ°æ®å¤ä»½å°ç¡¬çä¸,èmemcacheæåå¨çä¸è¥¿å ¨é¨ä¸¢å¤±;è¿ä¹è¯´æmemcacheä¸éååæ°æ®åºæ¥ç¨,å¯ä»¥ç¨æ¥åç¼åã
å¼è¨
è¿éæ们主è¦å©ç¨Redisçsetnxçå½ä»¤æ¥å¤çé«å¹¶åã
setnx æ两个åæ°ã第ä¸ä¸ªåæ°è¡¨ç¤ºé®ã第äºä¸ªåæ°è¡¨ç¤ºå¼ãå¦æå½åé®ä¸åå¨ï¼é£ä¹ä¼æå ¥å½åé®ï¼å°ç¬¬äºä¸ªåæ°å为å¼ãè¿å 1ãå¦æå½åé®åå¨ï¼é£ä¹ä¼è¿å0ã
å建åºå表
CREATEÂ TABLEÂ `storage`Â (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `number` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
)Â ENGINE=InnoDBÂ AUTO_INCREMENT=1Â DEFAULTÂ CHARSET=latin1
设置åå§åºå为10
å建订å表
CREATEÂ TABLEÂ `order`Â (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `number` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
)Â ENGINE=InnoDBÂ AUTO_INCREMENT=1Â DEFAULTÂ CHARSET=latin1
æµè¯ä¸ç¨éçæ¶å
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
$sql="select `number` from storage where id=1 limit 1";
$res = $pdo->query($sql)->fetch();
$number = $res['number'];
if($number>0)
{
 $sql ="insert into `order` VALUES (null,$number)";
 $order_id = $pdo->query($sql);
 if($order_id)
 {
 $sql="update storage set `number`=`number`-1 WHERE id=1";
 $pdo->query($sql);
 }
}
abæµè¯æ¨¡æ并åï¼åç°åºåæ¯æ£ç¡®çã
mysql> select * from storage;
+----+--------+
| id | number |
+----+--------+
|Â 1Â |Â 0Â |
+----+--------+
1 row in set (0.00 sec)
å¨æ¥ç订å表
mysql> select * from `order`;
+----+--------+
| id | number |
+----+--------+
|Â 1Â |Â 10Â |
|Â 2Â |Â 10Â |
|Â 3Â |Â 9Â |
|Â 4Â |Â 7Â |
|Â 5Â |Â 6Â |
|Â 6Â |Â 5Â |
|Â 7Â |Â 5Â |
|Â 8Â |Â 5Â |
|Â 9Â |Â 4Â |
|Â 10Â |Â 1Â |
+----+--------+
10 rows in set (0.00 sec)
åç°åå¨å 个订åé½æ¯æä½çåä¸ä¸ªåºåæ°æ®ï¼è¿æ ·å°±å¯è½å¼èµ·è¶ åçæ åµã
ä¿®æ¹ä»£ç å å ¥rediséè¿è¡æ°æ®æ§å¶
<?php
/**
 * Created by PhpStorm.
 * User: daisc
 * Date: 2018/7/23
 * Time: 14:45
 */
class Lock
{
 private static $_instance ;
 private $_redis;
 private function __construct()
 {
 $this->_redis = new Redis();
 $this->_redis ->connect('127.0.0.1');
 }
 public static function getInstance()
 {
 if(self::$_instance instanceof self)
 {
  return self::$_instance;
 }
 return self::$_instance = new self();
 }
 /**
 * @function å é
 * @param $key éå称
 * @param $expTime è¿ææ¶é´
 */
 public function set($key,$expTime)
 {
 //åæ¥å é
 $isLock = $this->_redis->setnx($key,time()+$expTime);
 if($isLock)
 {
  return true;
 }
 else
 {
  //å é失败çæ
åµä¸ãå¤æéæ¯å¦å·²ç»åå¨ï¼å¦æéåå¨åå·²ç»è¿æï¼é£ä¹å é¤éãè¿è¡éæ°å é
  $val = $this->_redis->get($key);
  if($val&&$val<time())
  {
  $this->del($key);
  }
  return $this->_redis->setnx($key,time()+$expTime);
 }
 }
 /**
 * @param $key 解é
 */
 public function del($key)
 {
 $this->_redis->del($key);
 }
}
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root');
$lockObj = Lock::getInstance();
//å¤ææ¯è½å éæå
if($lock = $lockObj->set('storage',10))
{
 $sql="select `number` from storage where id=1 limit 1";
 $res = $pdo->query($sql)->fetch();
 $number = $res['number'];
 if($number>0)
 {
 $sql ="insert into `order` VALUES (null,$number)";
 $order_id = $pdo->query($sql);
 if($order_id)
 {
  $sql="update storage set `number`=`number`-1 WHERE id=1";
  $pdo->query($sql);
 }
 }
 //解é
 $lockObj->del('storage');
}
else
{
 //å éä¸æåæ§è¡å
¶ä»æä½ã
}
å次è¿è¡abæµè¯ï¼æ¥çæµè¯ç»æ
mysql> select * from `order`;
+----+--------+
| id | number |
+----+--------+
|Â 1Â |Â 10Â |
|Â 2Â |Â 9Â |
|Â 3Â |Â 8Â |
|Â 4Â |Â 7Â |
|Â 5Â |Â 6Â |
|Â 6Â |Â 5Â |
|Â 7Â |Â 4Â |
|Â 8Â |Â 3Â |
|Â 9Â |Â 2Â |
|Â 10Â |Â 1Â |
+----+--------+
10 rows in set (0.00 sec)
åç°è®¢å表没ææä½åä¸ä¸ªåºåæ°æ®çæ åµãæ以å©ç¨rediséæ¯å¯ä»¥ææçå¤çé«å¹¶åçã
è¿éå¨å éçæ¶åå ¶å®æ¯å¯ä»¥ä¸éè¦å¤æè¿ææ¶é´çï¼è¿éæ们为äºé¿å é ææ»éï¼æ以å ä¸ä¸ªè¿ææ¶é´çå¤æãå½è¿æçæ¶å主å¨å é¤è¯¥éã