PHPでのNoSQL実装

スピードは、あなたのプロジェクトの重要な要素の1つです。 リソースが1日あたり10〜100人のユーザーによってアクセスされている限り、すべては問題ありません。ユーザーは幸せで、友人や友人の友人などを招待します。 負荷が増大しています...

写真を見たり、ブログを読んだり、インターネットで音楽を聴いたりする人。あなたのサイトがどの言語で書かれているか、どのDBMSが使われているか、キャッシュを使うかどうかは関係ない。 彼にとって興味深いコンテンツへのアクセスは可能な限り高速であることが重要です。

しかし、時間が経つにつれて、プロジェクトへの参加者が増加するため、プロジェクトを成功させるには常により高い生産性が必要になります。

PHP + MySQL + Memcachedの束を考えてみましょう。

ユーザーにコメント付きの記事を表示するには、次のものが必要です。
  1. キャッシュに記事(コメント付き)があるかどうかを確認する
  2. そうでない場合は、「親愛なる」JOINテキスト+コメントを作成します
  3. すべてをキャッシュに入れる
  4. ユーザーとコンテンツを共有する
このアルゴリズムの大きなマイナスは、筋肉質のJOIN (または他のDBMS)です。
現代のnoSQLの概念は、正規化されたデータ構造に対する答えとして浮上しています。

前の例のPHP + Memcachedバンドルを検討してください。
  1. キャッシュに記事(コメント付き)があるかどうかを確認する
  2. そうでない場合は、キャッシュに入れます
  3. ユーザーとコンテンツを共有する
1つのポイントが「簡単」なりました 。 参加しませんが、どこでデータを取得しますか? ファイルに保存します

「ドキュメント」という用語が表示されます(例:コメント付きの記事)。 noSQLテクノロジーをより具体的に理解するために、私はいつものように 「自転車になろう」と思っていました。

JIM2プロトタイプ

必須: Apache + mod_php + php_xcache

ファイルが保存されるパスを指定します。
define( 'STORAGE_PATH' , 'F:\\tmp\\jim2' );

使用例:

記録する
$collection = new Collection();

$vasya = array
(
'name' => 'Vasya' ,
'sex' => 'male'
);

$masha = array
(
'name' => 'Masha' ,
'sex' => 'female'
);

$jim = array
(
'name' => 'Jim' ,
'sex' => 'male' ,
'type' => 'dog'
);

$collection->put($vasya);
$collection->put($masha);
$collection->put($jim);

$collection->createIndex( array ( 'name+sex' , 'sex' ) );

読書
$collection = new Collection();

$keys = xcache_get( './index/sex/male' );

foreach ($keys as $key)
{
print_r( $collection-> get ($key) );
}
機能:
  1. ドキュメントはキー/値として保存されます
  2. ドキュメントプロパティを使用して、インデックスを作成できます(追加のキーが作成されます)
  3. 各ドキュメントには、ドキュメントのバージョンを示す_revフィールドがあります。 これにより、ドキュメントのバージョンがチェックされるため、書き込み用にファイルをロックする際の衝突が防止されます。
  4. また、コレクション自体にバージョンが保存されます。 ドキュメントのコレクションに基づいて構築されたキャッシュの関連性を検証できるように作成
まだ何もありませんが、次のようになります。
  1. APIを使用してコレクションを取得する
  2. ページネーション
  3. ...あなたの提案のいずれか
PS直接キャッシュアクセスが常に迅速に機能することは明らかなので、読み取り速度を比較しませんでした。 しかし、挿入速度(100要素)は満足しています。MySQL+ memcachedバンドルは、JIM2(0.4791223)から(0.5417142)遅れていました。

Source: https://habr.com/ru/post/J80324/


All Articles