redisææ¯ç使ç¨ï¼
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éè¿è¡æ°æ®æ§å¶
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();
}
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
{
$this->del($key);
}
return $this->_redis->setnx($key,time()+$expTime);
}
}
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éæ¯å¯ä»¥ææçå¤çé«å¹¶åçã
è¿éå¨å éçæ¶åå ¶å®æ¯å¯ä»¥ä¸éè¦å¤æè¿ææ¶é´çï¼è¿éæ们为äºé¿å é ææ»éï¼æ以å ä¸ä¸ªè¿ææ¶é´çå¤æãå½è¿æçæ¶å主å¨å é¤è¯¥éã
æ»ç»
以ä¸å°±æ¯è¿ç¯æç« çå ¨é¨å 容äºï¼å¸ææ¬æçå 容对大家çå¦ä¹ æè å·¥ä½å ·æä¸å®çåèå¦ä¹ ä»·å¼ï¼å¦ææçé®å¤§å®¶å¯ä»¥çè¨äº¤æµï¼è°¢è°¢å¤§å®¶å¯¹èæ¬ä¹å®¶çæ¯æã