PHP 中使用 Memcached 作缓存(5)- memcached扩展之 cas 方法

Memcached 使用乐观锁的机制来保持并发访问情况下数据的一致性,我们可以通过 memcached扩展的 cas方法来利用这一有优点。
cas 方就实施 “检测再赋值”的操作,只有当我们所指定存储值的键的值在当前客户端最后一次获取后没有其他客户端对其进行更改方能成功,这需要一个 Memcached 为当前存储项分配的一个64位数值来实现,Memcached::get*()在调用的时候可以获取到这个数值。

先面我们用多个进程来模拟并发:

<?php
if(!isset($argv[1]) || empty($argv[1])){
	die('Prefix required.');
}
$sPrefix = $argv[1];
echo $sPrefix, "\n";

CONST KEY = 'cas';

$oMemCached = new \Memcached();
$oMemCached->addServer('127.0.0.1', 11211, 10);
$i = 100;
while($i--){
	$sVal = $sPrefix . $i;
	echo $sVal;
	do{
		echo '.';
		$aVal = $oMemCached->get(KEY, null, $fCAS);
		if(\MemCached::RES_NOTFOUND == $oMemCached->getResultCode()){
			$oMemCached->set(KEY, array($sVal));
		}
		else{
			array_push($aVal, $sVal);
			$oMemCached->cas($fCAS, KEY, $aVal);
		}
	}while(\Memcached::RES_SUCCESS != $oMemCached->getResultCode());
	echo "\n";
	usleep(rand(0, 10));
}

if('A' === $sPrefix){
	sleep(2);
	file_put_contents('result.txt', join("\n", $oMemCached->get(KEY)));
	$oMemCached->flush();
}

我们将这个文件保存到 ~/memcached-cas.php
然后通过运行下面的名启动测试:

(php ~/memcached-cas.php A > a.txt &);\
(php ~/memcached-cas.php B > b.txt &);\
(php ~/memcached-cas.php C > c.txt &);\
(php ~/memcached-cas.php D > d.txt &);

我们可用通过查看 a.txt、b.txt、c.txt、d.txt 中的连续的 “.” 得知存储某个值的时候值正在被其他的客户端占用。
这里是我的部分结果。

$ tail -20 a.txt
A19………
A18..
A17.
A16..
A15..
A14…
A13…
A12…..
A11…
A10..
A9.
A8…
A7..
A6.
A5.
A4……….
A3.
A2.
A1…
A0.

$ tail -20 b.txt
B19………
B18.
B17..
B16…..
B15..
B14.
B13.
B12.
B11..
B10.
B9.
B8..
B7.
B6.
B5.
B4..
B3.
B2.
B1.
B0..

$ tail -20 c.txt
C19…
C18..
C17..
C16..
C15..
C14….
C13.
C12.
C11.
C10.
C9.
C8.
C7.
C6..
C5.
C4.
C3.
C2.
C1..

$ head -20 d.txt

D
D99..
D98….
D97….
D96..
D95…..
D94………
D93…
D92……
D91…
D90…..
D89……
D88….
D87.
D86..
D85..
D84..
D83.
D82.

历史搜索记录:

Post a Comment

Your email is never shared. Required fields are marked *

*
*