ホームページ  >  記事  >  php教程  >  php Memcacheにメッセージキューを実装する

php Memcacheにメッセージキューを実装する

WBOY
WBOYオリジナル
2016-06-13 12:20:50926ブラウズ

メッセージ キューが大きい場合、大規模なデータベースを頻繁にシリアル化および逆シリアル化すると、時間がかかりすぎます。以下は、PHP を使用して実装したメッセージ キューです。末尾にデータを挿入し、末尾を操作するだけで済みます。読み取りや操作のためにメッセージ キュー全体を操作する必要はありません。ただし、このメッセージ キューはスレッドセーフではありません。競合の可能性を回避しようとしているだけです。メッセージの密度がそれほど高くない場合 (たとえば、数秒に 1 つのメッセージだけである場合)、この方法での使用を検討できます。
スレッドの安全性を実現したい場合、ファイルをロックしてから操作することをお勧めします。コードは次のとおりです:

コードをコピー コードは次のとおりです:


class Memcache_Queue
{
プライベート $memcache;
プライベート $name;
関数 __construct($maxSize, $name, $memcache, $prefix = "__memcache_queue__")
{
if ($ memcache == null) {
throw new Exception("memcache オブジェクトが null、最初にオブジェクトを新規作成します。");
$this->memcache = $memcache; >名前 = $ 名前;
$this->prefix = $prefix;
$this->front = 0; ->real = 0;
$this->size = 0;
}
関数 __get($name)
{
return $this->get($name) ;
}
関数 __set($name, $value)
{
$this->add($name, $value);
return $this>; 🎜>関数 isEmpty( )
{
return $this->size == 0;
}
function isFull()
{
return $this->size = = $this->gt ;maxSize;
}
function enQueue($data)
{
if ($this->isFull()) {
throw new Exception("キューはFull");
}
$this->increment("size");
$this->set($this->real, $data);
$this- >set(" real", ($this->real 1) % $this->maxSize);
return $this>}
function deQueue()
{
if ($this ->isEmpty()) {
throw new Exception("Queue is Empty")
}
$this->decrement("size"); this->delete ($this->front);
$this->set("front", ($this->front 1) % $this->maxSize); $this;
}
関数 getTop()
{
return $this->get($this->front);
}
関数 getAll()
{
return $this->getPage();
}
関数 getPage($offset = 0, $limit = 0)
{
if ($this->isEmpty () || $ this->size < $offset) {
return null
}
$keys[] = $this->front $offset ) % $this->maxSize);
$num = 1;
for ($pos = ($this->front $offset 1) % $this->maxSize; $pos != $ this->real ; $pos = ($pos 1) % $this->maxSize)
{
$keys[] = $this->getKeyByPos($pos); ;
if ($limit > 0 && $limit == $num) {
break;
}
}
return array_values($this->memcache->get( $keys));
}
関数 makeEmpty()
{
$keys = $this->getAllKeys();
foreach ($keys を $value) $this->delete($value);
$this->delete("front"); ->delete( "サイズ");
$this->delete("maxSize");
プライベート関数 getAllKeys()
{
if ($this-> ;isEmpty())
{
return array();
}
$keys[] = $this->getKeyByPos($this->front); pos = ($this ->front 1) % $this->maxSize; $pos != $this->real; $pos = ($pos 1) % $this->maxSize)
{
$keys [] = $this->getKeyByPos($pos);
}
return $keys;
プライベート関数 add($pos, $data)
{
$ this->memcache->add($this->getKeyByPos($pos), $data);
return $this>}
プライベート関数 increment($pos); )
{
return $this->memcache->increment($this->getKeyByPos($pos));
}
プライベート関数 decrement($pos)
{
$this ->memcache->decrement($this->getKeyByPos($pos));
}
プライベート関数セット($pos, $data)
{
$this->memcache->set($this->getKeyByPos($pos), $data);
return $this;
プライベート関数 get($pos)
{
return $this->memcache->get($this->getKeyByPos($pos))
}
プライベート関数 delete($pos)
{
return $this->memcache->delete($this->getKeyByPos($pos));
プライベート関数 getKeyByPos($pos)
{
return $this->プレフィックス . $this->name .
}
}


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。