ホームページ  >  記事  >  バックエンド開発  >  php Memcacheにメッセージキューを実装する

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

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

php で実装されたメッセージ キュー Memcache
Memcache は通常、キャッシュ サービスに使用されます。ただし、メッセージ ブロードキャスト システムなど、多くの場合、メッセージ キューが必要になります。データベースから直接メッセージを取得すると、負荷がかかると失敗することがよくあります。メッセージ キュー全体がキーとともに memcache にキャッシュされている場合。

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

クラス Memcache_Queue
{
プライベート $memcache;
プライベート $name;
プライベート $プレフィックス;
function __construct($maxSize, $name, $memcache, $prefix = "__memcache_queue__")
{
if ($memcache == null) {
throw new Exception("memcache オブジェクトが null、new オブジェクトが最初です。");
}
$this->memcache = $memcache;
$this->name = $name;
$this->prefix = $prefix;
$this->maxSize = $maxSize;
$this->front = 0;
$this->real = 0;
$this->サイズ = 0;
}
関数 __get($name)
{
return $this->get($name);
}
関数 __set($name, $value)
{
$this->add($name, $value);
$this を返します。
}
関数 isEmpty()
{
$this->size == 0 を返します。
}
関数 isFull()
{
return $this->size == $this->maxSize;
}
関数 enQueue($data)
{
if ($this->isFull()) {
throw new Exception("キューがいっぱいです");
}
$this->increment("サイズ");
$this->set($this->real, $data);
$this->set("real", ($this->real + 1) % $this->maxSize);
$this を返します。
}
関数 deQueue()
{
if ($this->isEmpty()) {
throw new Exception("キューが空です");
}
$this->decrement("サイズ");
$this->delete($this->front);
$this->set("フロント", ($this->front + 1) % $this->maxSize);
$this を返します。
}
関数 getTop()
{
return $this->get($this->front);
}
関数 getAll()
{
$this->getPage(); を返す
}
関数 getPage($offset = 0, $limit = 0)
{
if ($this->isEmpty() || $this->size null を返します。
}
$keys[] = $this->getKeyByPos(($this->front + $offset) % $this->maxSize);
$num = 1;
for ($pos = ($this->front + $offset + 1) % $this->maxSize; $pos != $this->real; $pos = ($pos + 1) % $this- >最大サイズ)
{
$keys[] = $this->getKeyByPos($pos);
$num++;
if ($limit > 0 & $limit == $num) {
壊す;
}
}
return array_values($this->memcache->get($keys));
}
関数 makeEmpty()
{
$keys = $this->getAllKeys();
foreach ($keys を $value) {
$this->delete($value);
}
$this->delete("本物");
$this->delete("フロント");
$this->delete("サイズ");
$this->delete("maxSize");
}
プライベート関数 getAllKeys()
{
if ($this->isEmpty())
{
戻り配列();
}
$keys[] = $this->getKeyByPos($this->front);
for ($pos = ($this->front + 1) % $this->maxSize; $pos != $this->real; $pos = ($pos + 1) % $this->maxSize )
{
$keys[] = $this->getKeyByPos($pos);
}
$keys を返します。
}
プライベート関数 add($pos, $data)
{
$this->memcache->add($this->getKeyByPos($pos), $data);
$this を返します。
}
プライベート関数インクリメント($pos)
{
return $this->memcache->increment($this->getKeyByPos($pos));
}
プライベート関数デクリメント($pos)
{
$this->memcache->decrement($this->getKeyByPos($pos));
}
プライベート関数セット($pos, $data)
{
$this->memcache->set($this->getKeyByPos($pos), $data);
$this を返します。
}
プライベート関数 get($pos)
{
return $this->memcache->get($this->getKeyByPos($pos));
}
プライベート関数 delete($pos)
{
return $this->memcache->delete($this->getKeyByPos($pos));
}
プライベート関数 getKeyByPos($pos)
{
$this->prefix を返します。 $this->name . $pos;
}

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