Memcache は、PHP 開発で一般的に使用されるキャッシュ方法であり、同時実行性の高いシステムでは不可欠なコンポーネントです。
実際の開発では、Memcache にはキーに対するグループ操作をサポートできないという満足のいかない問題があります。
グループ操作は、ドメイン操作とも呼ばれます。たとえば、記事システムでは、フロントエンド部分で Memcache を使用して、リスト ページ データと記事詳細ページ データをキャッシュします。どちらのタイプのデータも比較的大きいです。その後、記事がバックグラウンドで公開されると、リスト ページが最新のリストに更新される必要があります。これには多くのリスト ページが含まれる可能性があります。もちろん、記事詳細ページについては更新する必要はありません。
現時点では、プログラムがリスト ページ データを自動的に更新できるように、元のキャッシュを削除する必要があります。ただし、Memcache のフラッシュ機能の使用には問題があります。つまり、大規模な同時実行条件下では、すべてのキャッシュが削除され、キャッシュが再構築されると、リスト ページと記事ページのデータを含むすべてのデータが消去されます。非常に高い負荷がかかります。
さらに、プログラム構成や高速化のためにキャッシュされたデータベース テーブル構造など、削除したくないキャッシュ変数が失われる状況も考えられます。
したがって、リスト ページを 1 つのグループに、記事ページのデータを別のグループに、プログラム構成を別のグループに設定できる、グループ操作をサポートするキャッシュ メカニズムが必要です。リスト ページを再構築する必要がある場合は、他のグループのデータに影響を与えることなく、リスト ページ グループ内のすべてのデータを削除するだけで済みます。
いくつかのソリューションをテストした後、次のソリューションが最も理想的で高速です。まずコードを見てから、原理について説明します。
クラスMyCache
{
プライベート $mmc = null;
private $group = null;
プライベート $version = 1;
関数 __construct($group){
If(!class_exists('mmcache')){
$this->mmc = false;
戻る;
}
$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);
}
関数セット($key, $var, $expire=3600){
If(!$this->mmc)return;
Return $this->mmc->set($this->group.'_'.$this->version.'_'.$key, $var, $expire);
}
関数 get($key){
If(!$this->mmc)return;
Return $this->mmc->get($this->group.'_'.$this->version.'_'.$key);
}
関数 incr($key, $value=1){
If(!$this->mmc)return;
Return $this->mmc->increment($this->group.'_'.$this->version.'_'.$key, $value);
}
関数 decr($key, $value=1){
If(!$this->mmc)return;
Return $this->mmc->decrement($this->group.'_'.$this->version.'_'.$key, $value);
}
関数削除($key){
If(!$this->mmc)return;
Return $this->mmc->delete($this->group.'_'.$this->version.'_'.$key);
}
関数 flash(){
If(!$this->mmc)return;
++$この->バージョン;
$this->mmc->set('version_'.$this->group, $this->version);
}
}
?>
上記のクラスは比較的完全で、Memcache サービスへのリンク、値の設定と取得、値の増減、キーの削除、すべての削除 (フラッシュ) が含まれます。これには、通常の Memcache 操作関数と完全削除 (フラッシュ) 操作の拡張機能が含まれます。
コードからわかるように、サポート グループのフラッシュ関数はバージョン キーを通じて実装されます。つまり、グループの変数が保存されるたびに、変数のキーによってバージョン値が追加されます。は数値 (1 から) であり、キーの保存および取得時にバージョン値が使用されます。
開発者が現在のグループのデータをフラッシュしたい場合、フラッシュ操作は単にいくつかのバージョン値 (プラス 1) を変更します。その後、次回キーにアクセスしたときに、バージョンが変更されているため、元の値は取得されません。変更されました。つまり、キー名が変更されました。このようにして、効率のオーバーヘッドなしで、元の値が Memcache によって自動的にリサイクルされます。また、プログラムはバージョンの保存と取得を追加するだけであり、データ量は極めて少なく、基本的にシステム効率には影響しません。
上記のクラスを通じて、Memcache キャッシュ上でグループ操作を実行できます。また、この PHP クラスは、memcache のインターフェイス関数に直接アクセスするためのソケットの追加など、拡張することもできます。この方法では、memcache をインストールする必要はありません。これにより、フラッシュの誤動作が回避され、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('単語');
echo $mc->get('word');
$mc->set('counter', 1, 290000);
echo $mc->get('counter');
// 価値を追加します
$mc->incr('counter');
$mc->incr('counter');
echo $mc->get('counter');Memcache は、PHP 開発で一般的に使用されるキャッシュ メソッドであり、同時実行性の高いシステムでは不可欠なコンポーネントです。
実際の開発では、Memcache にはキーに対するグループ操作をサポートできないという満足のいかない問題があります。
グループ操作は、ドメイン操作とも呼ばれます。たとえば、記事システムでは、フロントエンド部分で Memcache を使用して、リスト ページ データと記事詳細ページ データをキャッシュします。どちらのタイプのデータも比較的大きいです。その後、記事がバックグラウンドで公開されると、リスト ページが最新のリストに更新される必要があります。これには多くのリスト ページが含まれる可能性があります。もちろん、記事詳細ページについては更新する必要はありません。
現時点では、プログラムがリスト ページ データを自動的に更新できるように、元のキャッシュを削除する必要があります。ただし、Memcache のフラッシュ機能の使用には問題があります。つまり、大規模な同時実行条件下では、すべてのキャッシュが削除され、キャッシュが再構築されると、リスト ページと記事ページのデータを含むすべてのデータが消去されます。非常に高い負荷がかかります。
さらに、プログラム構成や高速化のためにキャッシュされたデータベース テーブル構造など、削除したくないキャッシュ変数が失われる状況も考えられます。
したがって、リスト ページを 1 つのグループに、記事ページのデータを別のグループに、プログラム構成を別のグループに設定できる、グループ操作をサポートするキャッシュ メカニズムが必要です。リスト ページを再構築する必要がある場合は、他のグループのデータに影響を与えることなく、リスト ページ グループ内のすべてのデータを削除するだけで済みます。
いくつかのソリューションをテストした後、次のソリューションが最も理想的で高速です。まずコードを見てから、原理について説明します。
クラスMyCache
{
プライベート $mmc = null;
private $group = null;
プライベート $version = 1;
関数 __construct($group){
If(!class_exists('mmcache')){
$this->mmc = false;
戻る;
}
$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);
}
関数セット($key, $var, $expire=3600){
if(!$this->mmc)return;
return $this->mmc->set($this->group.'_'.$this->version.'_'.$key, $var, $expire);
}
関数 get($key){
if(!$this->mmc)return;
return $this->mmc->get($this->group.'_'.$this->version.'_'.$key);
}
関数 incr($key, $value=1){
if(!$this->mmc)return;
return $this->mmc->increment($this->group.'_'.$this->version.'_'.$key, $value);
}
関数 decr($key, $value=1){
if(!$this->mmc)return;
return $this->mmc->decrement($this->group.'_'.$this->version.'_'.$key, $value);
}
関数削除($key){
if(!$this->mmc)return;
return $this->mmc->delete($this->group.'_'.$this->version.'_'.$key);
}
関数フラッシュ(){
if(!$this->mmc)return;
++$この->バージョン;
$this->mmc->set('version_'.$this->group, $this->version);
}
}
?>
上のタイプの比較には、Memcache サービスの接続、値の設定と取得、値の増加、さらに、一般的な Memcache 操作機能、および完全削除 (フラッシュ) 操作の拡張が含まれています。 。
サポートされているグループのフラッシュ機能の実現は、このキーのバージョンを変更することによって実現されます。つまり、そのグループを毎回保存するたびに、そのグループの量が追加されるタイミング、量のキーである都市バージョン値、バージョン値は数字です(からわかるように、サポートされています)。 1 開始)、キーが保存されて取得されると、バージョン値が使用されます。
発行者が現在のグループのデータをフラッシュする場合、フラッシュ操作は一部のバージョンの値を個別に変更するだけであり(追加)、次のキーを取得する場合は、バージョンが変更されたため、元に戻されない値が取得されます。このように格納された値は、効率の低下を引き起こすことなく、バージョンの追加だけで Memcache によって自動的に復元されます。基本的には何の影響もありません。
上記のクラスにより、Memcache のグループ操作を実行できますが、この PHP クラスは、ソケットに直接 memcache にアクセスするインターフェイス機能を追加するなど、PHP 環境で memcache 展開クラスをインストールする必要がなく、継続的に拡張することもできます。样更有效フラッシュを避けるための操作が行われ、apc などのメモリを追加した後でも、ソケットが memcache インターフェイスにアクセスすることはあまりありません。
さらに、MyCache クラスには追加の機能もあります。Memcache サービスが停止した場合、MyCache クラスは単に空の値を返すだけであり、直接的な問題は発生しません。
以下付属のMyCacheクラスの使用方法:
// 組み込み定义
include('MyCache.php');
// 实例化
$mc = 新しい MyCache('abc'); // 要有領域
// 設置值
$mc->set('word', 'hello world', 900);
// 取得值
echo $mc->get('word');
// 删除值
$mc->delete('単語');
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();
本文出典「振中的技术记事本」博客
// 减少值
$mc->decr('counter');
echo $mc->get('counter');
//グループごとに削除
$mc->flush();
著者「Zhenzhongの技術メモ帳」