onPHPのキャッシングシステムの概要

こんにちは

この記事では、 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実装が私たちの世界に存在します(クリック可能)







この図は、ストレージの実装( bridgeを参照)と特定の問題を解決するさまざまなデコレーターの両方を示しています。



OnphpはRedisとの連携をサポートしています。 Memcached-2つの実装全体: ソケット上およびMemcacheの使用( http://php.net/Memcache ); SharedMemoryを使用できます。 これがインストールにない場合は、 アプリケーションメモリで作業します

サポートされている技術はさまざまですが、Memcached以外のものを使用する単一のonphpプロジェクトは知りません。

Memcachedはこの世界を支配します。 :)



次の理由により、2つのMemcache実装があります。



ほとんどすべての場所で、PemclMemcachedを使用しています。これは、Memcache拡張機能を介してサーバーに接続します。 他の条件が同じであれば、より高速に動作し、 pconnectもサポートします

代替ライブラリ( MemcacheD )では、どういうわけかうまくいきませんでした。 そのための実装を作成しようとしましたが、その時点(約2年前)ではあまり安定していませんでした。



デコレータについて:



1つのキャッシュシステムに対するプロジェクトの比率が複数になる場合、 WatermarkedPeerを使用する必要があります。 その意味は、getActualWatermark()メソッドに要約されます。 たとえば、get実装は次のようになります

  public function get($key) { return $this->peer->get($this->getActualWatermark().$key); }
      
      





これにより、キーの競合が回避されます。 さまざまなプロジェクト/クラス/などからのデータ 別のキーで記録されます。 それ以外の場合、このキャッシュは何らかのストレージ実装の標準デコレータです。



複数のキャッシュシステムにデータを分散する必要がある場合は、php配信からmemkeshクラスターを使用するか、集計キャッシュのいずれかを使用できます。 それらのいくつかがあります。



これで多かれ少なかれ標準的な部分は終わります。 ほとんどのアプリケーションには、通常のキャッシングシステムを作成するのに十分なこの実装セットが必要です。



その後、詳細が始まります。





なぜなら ほとんどすべての実装がデコレータパターンを使用しているため、それらを非常にうまく組み合わせることができます。

たとえば、次の構成は有効です。



  $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



All Articles