Memcache は、PHP 開発で一般的に使用されるキャッシュ方法であり、同時実行性の高いシステムでは不可欠なコンポーネントです。
実際の開発において、Memcache には満足できない問題があります。それは、Memcache がキーに対するグループ操作をサポートできないことです。
グループ操作はドメイン操作とも呼ばれます。たとえば、記事システムはフロントエンド部分で Memcache を使用して、リスト ページ データと記事詳細ページ データをキャッシュします。どちらのタイプのデータも比較的大きいです。その後、記事がバックグラウンドで公開されると、リスト ページが最新のリストに更新される必要があります。これには多くのリスト ページが含まれる可能性があります。もちろん、記事詳細ページについては更新する必要はありません。
わかりました。この時点で、プログラムがリスト ページ データを自動的に更新できるように、元のキャッシュを削除する必要があります。ただし、Memcache のフラッシュ機能の使用には問題があります。つまり、大規模な同時実行条件下では、すべてのキャッシュが削除され、キャッシュが再構築されると、リスト ページと記事ページのデータを含むすべてのデータが消去されます。非常に高い負荷がかかります。
さらに、プログラム構成や高速化のためにキャッシュされたデータベーステーブル構造など、削除したくないキャッシュ変数が失われる状況も考えられます。
そのため、リスト ページを 1 つのグループに、記事ページのデータを別のグループに、プログラム構成を別のグループに設定できる、グループ操作をサポートするキャッシュ メカニズムが必要になります。リスト ページを再構築する必要がある場合は、他のグループのデータに影響を与えることなく、リスト ページ グループ内のすべてのデータを削除するだけで済みます。
いくつかのソリューションをテストした結果、次のソリューションが最も理想的で高速です。最初にコードを見てから、原理について説明します:
<?php class MyCache { private $mmc = null; private $group = null; function __construct($group){ if(!class_exists('mmcache')){ $this->mmc = false; return; } $this->mmc = new memcache(); $this->mmc->addServer('192.168.1.5', 11211); $this->mmc->addServer('192.168.1.6', 11211); $this->group = $group; $this->version = $this->mmc->get('version_'.$group); if(empty($this->version)){ $this->version=1; } } function set($key, $var, $expire=3600){ if(!$this->mmc)return; $this->check_version($this->group,$this->version,$key); return $this->mmc->set($this->group.'_'.$this->version.'_'.$key, $var, $expire); } function get($key){ if(!$this->mmc)return; $this->check_version($this->group,$this->version,$key); return $this->mmc->get($this->group.'_'.$this->version.'_'.$key); } function incr($key, $value=1){ if(!$this->mmc)return; return $this->mmc->increment($this->group.'_'.$this->version.'_'.$key, $value); } function decr($key, $value=1){ if(!$this->mmc)return; return $this->mmc->decrement($this->group.'_'.$this->version.'_'.$key, $value); } function delete($key){ if(!$this->mmc)return; return $this->mmc->delete($this->group.'_'.$this->version.'_'.$key); } function flush(){ if(!$this->mmc)return; ++$this->version; $this->mmc->set('version_'.$this->group, $this->version); } function check_version($goup,$version,$key){ if($version>1){ $version_old=$version-1; return $this->mmc->delete($goup.'_'.$version_old.'_'.$key); } } } ?>
上記のクラスは、Memcache サービスのリンクを含め、比較的完成しています。値の設定と取得、値の増減、およびキーの削除とすべての削除 (フラッシュ) を行います。これには、通常の Memcache 操作関数と完全削除 (フラッシュ) 操作の拡張機能が含まれます。コードからわかるように、サポート グループのフラッシュ関数はバージョン キーを通じて実装されます。つまり、グループの変数が保存されるたびに、変数のキーによってバージョン値が追加されます。バージョン値は数値 (1 から始まります) であり、キーの保存および取得時に使用されます。
開発者が現在のグループのデータをフラッシュしたい場合、フラッシュ操作は単にいくつかのバージョン値 (プラス 1) を変更します。その後、次回キーにアクセスするときに、元の値は取得されません。 Changed、つまりキー名が変更されました。このようにして、効率のオーバーヘッドなしで、元の値が Memcache によって自動的にリサイクルされます。また、プログラムはバージョンの保存と取得を追加するだけであり、データ量は極めて少なく、基本的にシステム効率には影響しません。
上記のクラスを通じて、Memcache キャッシュ上でグループ操作を実行できます。また、この PHP クラスは、memcache のインターフェイス関数に直接アクセスするためのソケットの追加など、memcache をインストールする必要がないように拡張することもできます。 PHP 環境では拡張クラスを使用する方がフラッシュの誤操作を避けるのに効果的であり、apc などのキャッシュ機構を追加した後でも、memcache インターフェースへのソケットアクセスは拡張よりもそれほど遅くなりません。
さらに、MyCache クラスには追加機能があります。memcache サービスが失敗した場合、MyCache クラスは直接エラーを起こさずに単に null 値を返します。
MyCache クラスの使用方法は次のとおりです:
// 引入定义 include('MyCache.php'); // 实例化 $mc = new MyCache('abc'); // 要有域 // 设置值 $mc->set('word', 'hello world', 900); // 取得值 echo $mc->get('word'); // 删除值 $mc->delete('word'); echo $mc->get('word'); $mc->set('counter', 1, 290000); echo $mc->get('counter'); // 增加值 $mc->incr('counter'); $mc->incr('counter'); echo $mc->get('counter'); // 减少值 $mc->decr('counter'); echo $mc->get('counter'); // 按组删 $mc->flush();
上記は、PHP でグループ操作をサポートする Memcache クラス (ドメイン操作) のコード例の詳細な紹介です。さらに関連する内容については、注目してください。 PHP 中国語 Web サイト (www.php.cn) にアクセスしてください。