ホームページ >バックエンド開発 >PHPチュートリアル >memcache の概要
memcached は、高性能の分散メモリ キャッシュ サーバーです。海外コミュニティサイト「LIVEJOURNAL」の開発チームが開発。
使用目的:
データベースクエリ結果をキャッシュすることでデータベースアクセス数を減らし、動的Webアプリケーションの速度とスケーラビリティを向上させます。
memcache は、無料のオープンソース、高性能、分散メモリ オブジェクト キャッシング システムです。動的な Web アプリケーションを高速化し、データベースの負荷を軽減するために使用されます。
memcahceの特徴
1. C/Sアーキテクチャに基づく、シンプルなプロトコル
2. libeventイベント処理に基づく{libeventは、Windows、Linux、bsd(派生版)に適したイベントトリガーに基づくネットワークライブラリです。 Unix システム) およびその他のプラットフォーム}
3. 組み込みメモリ保存方法
4. クライアントベースの memcached 分散が必要です
1. タスクに 10 個のサブシステムがある場合- タスク、これら 10 個のサブタスクを 10 台のサーバーに別々に配置すると、タスクの実行時間が大幅に短縮されます。)
2. 同じデータに頻繁にアクセスする必要がある場合
3. データ共有が必要な場合
C/S アーキテクチャの概要
インストールの起動(PDFドキュメントを参照)
各種コマンドの使用
set/add/replace/delete/get/gets/cas/stats/stats items/append/prepend/flush_allなど
memcahced some機能と制限事項
①メモリが十分にある限り、Memcached に保存できるアイテムデータの量に制限はありません
②単一の Memcached プロセスで使用される最大メモリは 2G です。より多くのメモリを使用するには、次のことができます。複数のポートで複数の Memcached プロセスを開きます
③ データの最大有効期限は 30 日です。永続的に設定すると、この時点で有効期限も切れます。定数 REALTIME_MAXDELTA
④60*60*24*30 は、キーの最大長を制御します。
⑤ この長さより大きい場合は格納できません
⑥ 1項目の最大データは1MBを超えるデータは格納されません。定数 POWER_BLOCK 1048576。
⑦デフォルトのスラブサイズです
⑧conn_init()による最大同時接続数は200です。freetotalによって制御され、ソフト接続の最大数は1024です。
⑨settings.maxconns=1024によって制御されます。 ⑩パラメータスペース占有に関連する: settings.factor=1.25、settings.chunk_size=48、スラブのデータ占有とステップ方法に影響します
PHP の Memcache クライアントのすべてのメソッドの概要 memcache 関数のすべてのメソッドのリストは次のとおりです:
Memcache::add - 値を追加します。すでに存在する場合は false を返します
Memcache::addServer - 使用するサーバー アドレスを追加します
Memcache::close - Memcache オブジェクトを閉じます
Memcache::connect - Memcache オブジェクトを作成します
memcache_debug - デバッグ関数を制御します
Memcache::decrement - 保存されたキーの値を減算します
Memcache::delete - キー値を削除します
Memcache::flush - キャッシュされたデータをすべてクリアします
Memcache::get -キー値を取得します
Memcache::getExtendedStats - プロセスプール内のすべてのプロセスの実行中のシステム統計を取得します
Memcache::getServerStatus - 実行中のサーバーのパラメータを取得します
Memcache::getStats - サーバーの実行中の統計をいくつか返します
Memcache ::getVersion - 実行中の Memcache のバージョン情報を返します
Memcache::increment - 保存されたキーに値を追加します
Memcache::pconnect - Memcache 永続接続オブジェクトを作成します
Memcache::replace - 既存のキーを上書きします
Memcache: :set - 値を追加します(すでに存在する場合は上書きします)
Memcache::setCompressThreshold – 特定のサイズより大きいデータを圧縮します
Memcache::setServerParams – 実行時にサーバーパラメータを変更します
Memcache::add の使用法
コードは次のとおりです:
注:
$key が存在しない場合は、この関数を使用して $var の値を保存します。機能的に同等の関数は memcache_add() です。
パラメータ:
$key: 保存されるキーの値。
$var: 保存された値、文字型、整数型は元の値として保存され、他の型は後で自動的にシリアル化されて保存されます。
$flag: MEMCACHE_COMPRESSED を使用して格納された値を圧縮するかどうか。true は圧縮を意味し、false は圧縮なしを意味します。
$expire: 保存された値の有効期限。0 の場合は、UNIX タイムスタンプまたは説明を使用して今後の時間を表すことができますが、秒を使用して表す必要があります。 2592000 秒 (30 日を意味します) を超えてはなりません。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE。 $key 値がすでに存在する場合は、FALSE が返されます。 その他の場合、Memcache::add() の使用法は Memcache::set() と同様です。
例:
コードは次のとおりです:
Memcache::addServerの使用法
手順:
使用可能なサーバー アドレスが接続プールに追加され、接続は Memcache::addServer で開かれます。スクリプトの実行後に自動的に閉じられます。または、Memcache::close() で手動で閉じることもできます。同じ関数は memcache_add_server() です。
このメソッドを使用する場合 (Memcache::connect() および Memcache::pconnect() メソッドと比較して)、ネットワーク接続は必要な場合にのみ確立されるため、接続プール システムに多くのサーバーを追加することによってネットワーク接続が増加することはありません。多くのサーバーが使用されていない可能性があるため、負担がかかります。
他のサーバーが正常である限り、このメソッドの実行のどの段階でも障害回復が発生します。ユーザーはこれらの接続リクエストの障害に気づきません。あらゆる種類のソケットまたは memcached サーバーレベルのエラーがフェイルオーバーを引き起こす可能性があります。既存のキーの追加などの通常のクライアント エラーでは、フェールオーバーはトリガーされません。
パラメータ:
$host サーバーアドレス
$port サーバーポート
$persistent が永続接続かどうか
$weight すべてのサーバーの中のこのサーバーの重み
$timeout 接続の継続時間
$retry_interval 接続の再試行間隔デフォルトは 15、-1 に設定すると再試行なしを意味します
$status はサーバーのオンライン ステータスを制御します
$failure_callback を使用すると、エラー メッセージを処理するためのフォールバック関数を設定できます。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE。
例:
成功した場合は TRUE を返し、失敗した場合は FALSE を返します。
例:
コードは次のとおりです:
$memcache_connect('memcache_host', 11211);
$memcache_obj = newメムキャッシュ ;$memcache_obj -> connect('memcache_host', 11211);
$memcache_obj->close();>
$host: memcached がリッスンしているリンクのホストを指します。このパラメータには、unix ドメイン名ソケットを使用する別の特別な接続メソッドがあります。 case
$port: memcached がリッスンしているリンクを指すポート。UNIX ドメイン名ソケットの場合、ポートは 0 に設定する必要があります。
$timeout: デーモンへの接続にかかる秒数。デフォルト値の 1 秒を使用する場合は、接続が遅すぎるとキャッシュの利点が失われる可能性があることを考慮する必要があります。
戻り値: 成功した場合はTRUE、失敗した場合はFALSE。
$memcache_obj = memcache_connect('memcache_host', 11211);
$memcache->connect('memcache_host; ' , 11 211) ;
?>
memcache::debug
説明:
php のコンパイル時に -enable-debug オプションが使用されている場合に限り、デバッグ関数を制御します。それ以外の場合、この関数は何の効果もありません。
パラメータ:
$on_off: true はデバッグをオンにすることを意味し、false はデバッグをオフにすることを意味します
戻り値:
コンパイル時に php が -enable-debug オプションを使用する場合は true を返し、それ以外の場合は false を返します
Memcache::decrement の使用法
説明:
Memcache::decremen メソッドは、保存されたキーの値をデクリメントします。操作、使用法は Memcache::increment と似ています。
memcache_decrement() 関数を使用することもできます。
パラメータ:
Key: 削減したいキーの名前
Value: 削減したい値。
戻り値:
成功した場合は減算された値を返し、失敗した場合は false を返します。
例:
この例では、Memcache::increment 関数も一緒にデモします。
Memcache::delete の使用法
コードは次のとおりです:
手順:
次の場合はキー値を削除しますパラメータ $timeout が設定されている場合、保存された値は設定された秒数後に期限切れになります。関数 memcache_delete() を使用することもできます。
戻り値:
成功した場合は TRUE を返し、失敗した場合は FALSE を返します。
例:
コードは次のとおりです:
説明:
キャッシュされたデータをすべてクリアします。 Memcache::flush は実際にはリソースを解放しません。占有されているメモリ領域を新しいキャッシュでカバーできるように、すべてのキャッシュを期限切れとしてマークするだけです。同じ関数は memcache_flush() です。
コードは次のとおりです:
$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_flush($memcache_obj);
説明: の関数 メソッドはキー値を取得するもので、キー値は配列にすることができ、結果にはキーと値のペアが含まれます。
パラメータ:
コードは次のとおりです:
$memcache_obj = memcache_connect( 'memcache_host', 11211);
$var = memcache_get($memcache_obj, 'some_key');
$memcache_obj->connect('memcache_host', 11211); memcache_obj ->get ('some_key');
$memcache_obj = memcache_connect('memcache_host', 11211);
$var = memcache_get($memcache_obj, Array('some_key', 'another_key'));新しい Memcache;
$memcache_obj->connect('memcache_host', 11211);
$var = $memcache_obj->get(Array('some_key', 'first_key')?>
説明:
プロセスプール内のすべてのプロセスの実行中のシステム統計を取得します。同じ関数は memcache_get_extended_stats() です。
パラメータ:
$type は、要求された戻り値のタイプを示します。reset、malloc、maps、cachedump、slabs、items、sizes;
$slabid は、最初のパラメータが「cachedump」に設定されている場合に使用されます。
$limit の最初のパラメータが "cachedump" に設定されている場合に使用されます。
戻り値:
成功した場合は統計が返されます。失敗した場合は false が返されます。
コードは次のとおりです:
コードは次のとおりです。 Memcache::getServerStatus (文字列$host [, int $port ] )
$port リスニング接続のホストのポート、デフォルトは 11211 です
戻り値:
サーバーステータスを正常に返します。サーバーが起動していない場合は 0 が返されます。他の数値はサーバーが起動していることを示します。
例:
コードは次のとおりです:
$memcache = new Memcache;
$memcache->addServer('memcache_host', 11211);
コードは次のとおりです:
array Memcache::getStats ([ string $type [, int $slabid [, int $limit ]]] )
説明:
$limit の最初のパラメータが "cachedump" に設定されている場合に使用されます。
Memcache::getVersion
コードは次のとおりです:
string Memcache::getVersion (void)
説明:
例:
コードは次のとおりです:
$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);
echo $memcache->getVersion( );
int Memcache::increment ( string $key [, int $value ] )
保存されたキーに値を追加します使用方法のリファレンス Memcache::decrement
コードは次のとおりです以下のように:
bool Memcache::pconnect ( string $host [, int $port [, int $timeout ]] )
手順:
Memcache 永続接続オブジェクトを作成する
$timeout: デーモンに接続する秒数に使用します。デフォルト値の 1 秒を変更する場合は、接続が遅すぎると利点が失われる可能性があることを考慮する必要があります。キャッシング。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE
コードは次のとおりです:
Memcache::replace
手順:
既存のキーを上書きします。同じ関数は memcache_replace() です。
パラメータ:
$key: 保存されるキーの値。
$var: 保存された値、文字型、整数型は元の値として保存され、他の型は後で自動的にシリアル化されて保存されます。
$flag: MEMCACHE_COMPRESSED を使用して格納された値を圧縮するかどうか。true は圧縮を意味し、false は圧縮なしを意味します。
$expire: 保存された値の有効期限。0 の場合は、UNIX タイムスタンプまたは説明を使用して時間を表すことができますが、秒を使用して表す必要があります。 2592000 秒 (30 日を意味します) を超えてはなりません。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE。 $key 値がすでに存在する場合は、FALSE が返されます。
Memcache::set
コードは次のとおりです。
値を追加し、既に存在する場合は上書きします。同じ関数は memcache_set() です。
パラメータ:
$key: 保存されるキーの値。
$var: 保存された値、文字型、整数型は元の値として保存され、他の型は後で自動的にシリアル化されて保存されます。
$flag: MEMCACHE_COMPRESSED を使用して格納された値を圧縮するかどうか。true は圧縮を意味し、false は圧縮なしを意味します。
$expire: 保存された値の有効期限。0 の場合は、UNIX タイムスタンプまたは説明を使用して今後の時間を表すことができますが、秒を使用して表す必要があります。 2592000 秒 (30 日を意味します) を超えてはなりません。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE。
例:
コードは次のとおりです:
コードは次のとおりです:
bool Memキャッシュ::setCom pressThreshold ( int $threshold [, float $min_ Savings ] )
パラメータ:
setCompressThreshold メソッドには 2 つのパラメータがあります。最初のパラメータは処理データ サイズの臨界点を表し、2 番目のパラメータは圧縮率を表し、デフォルトは 0.2 です。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE。
例:
コードは次のとおりです:
コードは次のとおりです:
bool Memcache::setServerParams ( string $host [, int $port [, int $timeout [, int$retry_interval [, bool $status [, callback $failure_callback ]]]]] )
$hostサーバーアドレス
$portサーバーポート
$timeout接続時間
$retry_interval 接続再試行間隔、デフォルトは15、-1に設定すると再試行なしを意味します
$ステータス制御サーバー オンラインステータス
$failure_callbackは許可しますエラーメッセージを処理するコールバック関数を設定します。
戻り値:
成功した場合はTRUE、失敗した場合はFALSE。
例:
コードは次のとおりです:
6. 包括的な使用例
key2 の値を取得: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
key1 の値を取得:
key2 の値を取得します:
$val = $mem->get('key1');
echo "Get key1 value: " . $val;
次に、replace メソッドを使用して、上記の key1 の値を置き換えます。メソッドは set と同じですが、最初のパラメーター key1 はデータ内容を置き換えるキーである必要があります。最終的な出力は次のとおりです。
コードは次のとおりです:
同様に、Memcache も配列を保存できます。以下は、Memcache に保存され、取得されて出力される配列です。
最後に、Memcache サーバーに保存されているすべてのデータをクリアすると、データがなくなっていることがわかります。最後に、key2 出力のデータが空になり、最後に接続が閉じられます。
Memcache を使用するタイミングと Memcache の使用環境
Memcache を使用する Web サイトは一般的に比較的大きなトラフィックを伴います。データベースへの負荷を軽減するために、Memcache はキャッシュ領域は、メモリおよびフロントエンドに情報の一部を保存し、高速にアクセスできます。結局のところ、単一の Memcache のメモリ容量には限界があります。ここでは私の個人的な意見を述べているだけであり、実践したわけではないので、参考としてのみ使用してください。
分散アプリケーション
Memcache は元々分散アプリケーションをサポートしていましたが、クライアントはより良いサポートを提供するために少し変更されました。たとえば、ユーザーベースの Web サイトの場合、各ユーザーはユーザー ID を持っているため、固定 ID に従って抽出してアクセスできます。たとえば、1 で始まるユーザーは に保存されます。最初の 1 つの Memcache サーバーでは、2 で始まるユーザーのデータが 2 番目の Memcache サーバーに保存され、まずユーザー ID に従ってアクセス データが変換され、アクセスされます。 ただし、これにはユーザー ID に基づいて判断する必要があるという欠点があります。ビジネスに一貫性がない場合、または他の種類のアプリケーションがあまり適切ではない場合は、実際のビジネスに基づいて検討するか、さらに別の方法を考えることができます。適切な方法。
データベースの負荷を軽減する
これは比較的重要です。基本的に、すべてのデータはデータベースに頻繁にアクセスされるため、データベースのパフォーマンスが大幅に低下し、同時により多くのユーザーにサービスを提供できなくなります。 MySQL など、テーブルが頻繁にロックされる場合は、Memcache にデータベースへの負荷を分散させます。変更が比較的小さく、フロントエンドへの大規模な変更を必要としない方法で、現在のアーキテクチャを変更する方法が必要です。 私が考えている簡単な方法:
バックエンドデータベース操作モジュールは、すべての選択操作(更新/削除/挿入に関係なく)を抽出し、対応するSQLに対して対応するハッシュアルゴリズムを実行して、ハッシュデータキーを計算します( MD5 または SHA)、Memcache でこのキーのデータを検索し、データが存在しない場合は、キャッシュに書き込まれていないことを意味し、データベースからデータを抽出します (1 つは配列クラス形式です)。 Memcache では、キーは SQL のハッシュ値であり、それに応じて有効期限 (1 時間など) が設定され、1 時間以内のデータがキャッシュから抽出され、効果的に負荷が軽減されます。データベース上で。欠点は、データがリアルタイムではないことです。データが変更されると、フロントエンドでリアルタイムに表示できなくなり、結局のところ、それぞれのデータの量が大量に占有される可能性があります。これは考慮する必要がある要素です。
Memcacheのセキュリティ
上記のMemcacheサーバーはクライアントを介して直接接続されており、検証プロセスなしで直接動作します。サーバーが直接インターネットに公開されている場合、より危険であり、少なくともデータ漏洩が発生します。 Mecache は root 権限で実行されているため、無関係な人が侵入したり、さらに悪いことにサーバーに侵入されたりする可能性があり、未知のバグやバッファ オーバーフローが存在する可能性があります。これらは私たちには未知であるため、リスクは予見できます。セキュリティの観点から、ハッカーの侵入やデータ漏洩を防ぐために 2 つの提案をさせていただきます。
イントラネット アクセス
2 つのサーバー間 (通常は Web サーバーと Memcache サーバーの間) でイントラネット アクセスを使用するのが最善です。一般的なサーバーには 2 つのネットワーク カードがあり、1 つはインターネットを指し、もう 1 つはイントラネットを指します。次に、Web サーバーがイントラネット ネットワーク カードを介して Memcache サーバーにアクセスできるようにし、Memcache サーバーの IP アドレスと IP アドレスを監視します。イントラネットのポートとイントラネット アクセスにより、他の不正アクセスを効果的に防止できます。
コードは次のとおりです:
Memcache サーバーは、イントラネット経由で IP 192.168.0.200 の 11211 ポートをリッスンするように設定されており、1024MB のメモリを占有して、最大 1024 の同時接続を許可します。
ファイアウォールのセットアップ
両方のサーバーがインターネットに接続されており、外部 IP 経由で Memcache にアクセスする必要がある場合、ファイアウォールまたはエージェントを使用して不正なアクセスをフィルタリングすることを検討できます。 。一般に、Linux では、FreeBSD で iptables または ipfw を使用して、一部の不正アクセスを防止するルールを指定できます。たとえば、Web サーバーに Memcache サーバーへのアクセスのみを許可し、他のアクセスをブロックするように設定できます。
上記の iptables ルールは、192.168.0.2 Web サーバーに Memcache サーバーへのアクセスを許可するだけであり、これに応じて、いくつかの他のルールを追加できます。セキュリティを強化します。これは必要に応じて実行できます。
実戦
//memcached設定
/*******************************************/
$mem_ip='127.0.0.1';
$mem_port=11211;
$mem_prefix='';
/*******************************************/
/*******************************************/
//セッション memcached 構成。独立した memcache サービス (異なる IP または異なるポート番号) に構成してください。
// 複数のミラー ステーション設定は同じである必要があります。そうでない場合、セッションは失われます
//競合を避けるために他のプログラムがこのサービスを使用することはできません。
/*******************************************/
$session_mem_ip='127.0.0.1';
$session_mem_port=11212;
function Instance_Memcached()
{
static $mem=false;
if($mem==false && isset($GLOBALS['mem_ip']) && isset($GLOBALS['mem_port']) && extension_loaded('memcache'))
{
$mem=new Memcache;
$mem->pconnect($GLOBALS[ 'mem_ip'],$GLOBALS['mem_port']) または die('memcache サーバーに接続できません!');
}
return $mem;
}
以上がmemcache の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。