この記事では、 plus1.wapstart.ruのキャッシュをどのように使用するか 、どのような問題が発生したか、いくつかの特殊なケースをどのように解決したかについて説明します。
用語から始めます。
この記事の「キャッシュ」により、キャッシュを含む、使用可能な高速ストレージの種類を理解できます。 この場合、ストレージには標準化されたインターフェイスが必要です。
サーバー/ストレージは、データを保存し、以下で説明するインターフェイスを介してデータにアクセスできるアプリケーションです。 たとえば、このアプリケーションはmemcachedである可能性があります。
onPHPフレームワークを使用します。 すべてのキャッシュ実装が継承する抽象CachePeerクラスがあります。 実装のインターフェースは、次のメソッドに縮小されます。
abstract public function get($key); abstract public function delete($key); abstract public function increment($key, $value); abstract public function decrement($key, $value); abstract protected function store( $action, $key, $value, $expires = Cache::EXPIRES_MEDIUM ); abstract public function append($key, $data);
次のCachePeer実装が私たちの世界に存在します(クリック可能)
![](https://habrastorage.org/storage2/4b4/f3b/dba/4b4f3bdbaa2d432812e052a98e1a0662.png)
この図は、ストレージの実装( bridgeを参照)と特定の問題を解決するさまざまなデコレーターの両方を示しています。
OnphpはRedisとの連携をサポートしています。 Memcached-2つの実装全体: ソケット上およびMemcacheの使用( http://php.net/Memcache ); SharedMemoryを使用できます。 これがインストールにない場合は、 アプリケーションメモリで作業します 。
サポートされている技術はさまざまですが、Memcached以外のものを使用する単一のonphpプロジェクトは知りません。
Memcachedはこの世界を支配します。 :)
次の理由により、2つのMemcache実装があります。
- Memcached(ソケット上)拡張を書くとき、Memcacheはまだ書かれていませんでした。
はい、 http://php.net/Memcachedとの名前の競合について知っています。 マスターではこれはすでに修正されています。
- PHPの設定にアクセスできず、必要な拡張機能を提供できない場合でも、ソケットに接続を実装できます。
ほとんどすべての場所で、PemclMemcachedを使用しています。これは、Memcache拡張機能を介してサーバーに接続します。 他の条件が同じであれば、より高速に動作し、 pconnectもサポートします 。
代替ライブラリ( MemcacheD )では、どういうわけかうまくいきませんでした。 そのための実装を作成しようとしましたが、その時点(約2年前)ではあまり安定していませんでした。
デコレータについて:
1つのキャッシュシステムに対するプロジェクトの比率が複数になる場合、 WatermarkedPeerを使用する必要があります。 その意味は、getActualWatermark()メソッドに要約されます。 たとえば、get実装は次のようになります
public function get($key) { return $this->peer->get($this->getActualWatermark().$key); }
これにより、キーの競合が回避されます。 さまざまなプロジェクト/クラス/などからのデータ 別のキーで記録されます。 それ以外の場合、このキャッシュは何らかのストレージ実装の標準デコレータです。
複数のキャッシュシステムにデータを分散する必要がある場合は、php配信からmemkeshクラスターを使用するか、集計キャッシュのいずれかを使用できます。 それらのいくつかがあります。
- AggregateCacheは、以前に再定義されたmt_srandを使用して、 そこからのmt_randの値に基づいて現在のキーで動作するサーバーを定義します。 奇妙に聞こえますが、実際には非常に単純です。
- SimpleAggregateCacheは通常、レンガのように単純です。 目的のサーバーは、数値キー表現をサーバーの数で割った残りに基づいて決定されます。
CyclicAggregateCache-last.fmで調査した実装。 彼女はとてもエレガントです。 円を描き、その上にサーバーの「マウントポイント」を配置します。
さらに、各サーバーのポイント数は、その重量に比例します。 リクエストを受信すると、キーは円上のあるポイントにもマッピングされます。 ポイントは、キーポイントまでの距離が短いサーバーによって処理されます。
このアプローチの利点は、サーバーをプールに追加するときに、値の一部のみが評価され、すべてが評価されないことです。 また、サーバーがプールから撤回されると、サーバーに保存されている値のみが消え、サーバーの残りの部分はほぼ均等に負荷を取ります。 アルゴリズムのアイデアについては、 こちらまたはこちらをご覧ください 。
これで多かれ少なかれ標準的な部分は終わります。 ほとんどのアプリケーションには、通常のキャッシングシステムを作成するのに十分なこの実装セットが必要です。
その後、詳細が始まります。
- DebugCachePeer-その名前は自己文書化されているため、説明する意味がありません。
- ReadOnlyPeer-読み取りのみが可能なキャッシュがありますが、書き込みはできません。 たとえば、他の場所から記録することも、たとえば魚のように異なる方法で実装することもできます。 これらのリポジトリーでは、ReadOnlyPeerを使用することをお勧めします。 アプリケーション側では、データの読み取りのみが行われ、書き込み/更新は行われません。
- CascadeCache-ソケットなどに、ローカルの高速アンロードキャッシュがあります。 また、何らかの種類のリモートキャッシュがあり、これも事前に設定されています。 アプリケーションで少し古いデータを使用できる場合、CascadeCacheを使用できます。 ローカルキャッシュから読み取り操作を行い、ローカルキャッシュにデータがない場合は、リモートキャッシュで要求されます。
「ネガティブ」な結果(null)の場合、2つの戦略のいずれかを使用できます-それらはローカルキャッシュに保存されるか、無視されます。
- MultiCachePeer-キャッシュの事前入力があります。 同時に、10台のサーバー上の1ダースの「ローカル」キャッシュをいっぱいにできることが望ましいです。
言い換えると、ある場所にデータを書き込み、一般的な場合には別の場所からデータを読み取りたいということです。 同時に、アプリケーションを搭載した各サーバーは同じ構成にする必要があります-展開の利便性のため。 これを行うには、MultiCachePeerを次のような構成で使用できます。
MultiCachePeer::create( PeclMemcached::create('localhost', 11211), array( PeclMemcached::create('meinherzbrennt', 11211), PeclMemcached::create('links234', 11211), PeclMemcached::create('sonne', 11211), PeclMemcached::create('ichwill', 11211), PeclMemcached::create('feuerfrei', 11211), PeclMemcached::create('mutter', 11211), PeclMemcached::create('spieluhr', 11211) ) );
- SequentialCache-時々クラッシュするか、単に利用できないリポジトリがあると想像してください。 たとえば、サービスを停止したり、再起動したりする場合があります。 同時に、アプリケーションは常にデータの受信を望んでいます。 この状況をカバーするには、次のような構成でSequentialCacheを使用できます。
$cache = new SequentialCache( PeclMemcached::create('master', 11211, 0.1), // - . array( PeclMemcached::create('backup', 11211, 0.1), ) )
なぜなら ほとんどすべての実装がデコレータパターンを使用しているため、それらを非常にうまく組み合わせることができます。
たとえば、次の構成は有効です。
$swordfish = ReadOnlyPeer::create( new SequentialCache( PeclMemcached::create('localhost', 9898, 0.1), array( PeclMemcached::create('backup', 9898, 0.1), ) ) );
またはこれでさえ:
$swordfish = CascadeCache::create( PeclMemcached::create('unix:///var/run/memcached_sock/memcached.sock', 0), ReadOnlyPeer::create( new SequentialCache( PeclMemcached::create('localhost', 9898, 0.1), array( PeclMemcached::create('backup', 9898, 0.1), ) ) ), CascadeCache::NEGATIVE_CACHE_OFF );
この場合、unix-socketを介してアクセス可能なローカルmemcacheでデータが最初に検索され、ない場合は、localhost:memcacheが要求されます:9898。 また、使用できない場合は、バックアップ:9898。 同時に、アプリケーションは、ポート9898のキャッシュからは読み取りのみが可能で、書き込みはできないことを認識しています。
onphpのキャッシュの可能性はこれで終わりではありません。 タスクをカバーする完全に異なる構成を作成できます。 onphpのCachePeerはクールです。
追伸 むかしむかし、彼らはonphpについての一連の記事について話しました。 始まりはこの投稿によって定められました。 将来的には、plus1.wapstart.ruでのフレームワークとその使用に関連する他のトピックに触れます。
pps この機会に、私たちが人材を探していることをお知らせします。
hantim.ru/jobs/11163-veduschiy-qa-menedzher-rukovoditel-otdela-testirovaniya
hantim.ru/jobs/11111-veduschiy-php-razrabotchik-team-leader