2017-11-08 5 views
0

私はキャッシュシステムを必要とするプログラムに取り組んでいました。 私は4つのカラム、 'mac'、 'src'、 'username'、 'main'を持つmysql dbを取得しています。どのMac、src、ユーザ名がキー/値で、メインテーブルの外部キーです。最初に3人に挿入され、自分のIDをメインに入れます。 私が得たデータは、メインテーブルの場合約18m、それぞれ約2mの場合3です。 メインに挿入する必要があるたびにselectを使用したくないので、配列をキャッシュに使用しました。 $ hash = ['mac' => []、 'src' => []、 'username' => []]; $ hash ['mac'] ['54:52:00:27:e4:91'];このようにデータを取得します。PHPキャッシュメカニズム

このアプローチは、ハッシュデータが500kを超えるとパフォーマンスが低下します。 これを行うにはもっと良い方法がありますか?

PS:nodeJSと同じことがありました。これは、ハッシュテーブルという名前のnpmモジュールを使用していました。パフォーマンスは、約4万個ごとに約10kずつ挿入されていました。私はPHPの配列について読んだことがあり、それらがHashtableであることが分かったが、今はそれが遠くのものと同じ仕事をしている。ただ1kで5分以上かかる。

+1

私を許して、しかし、あなたが必要とする理由、それは私にははっきりしていません何かのキャッシュを使用するあなたがインサートをしているだけの場合、毎回大量のデータを選択する必要があるのはなぜですか?たぶんテーブル構造についてもっと説明すれば分かります。 – jaswrks

+0

@ jaswrks 私は例を挙げて説明しましょう: 'mac'テーブルに 、私は200万のデータ、IDと値を持っています。 ID = 100100、値= '54:52:00:27:e4:91 '; 私のメインテーブルでは、私は行を挿入する必要があるので、私は'54のための 'mac ID:52:00:27:e4:91' thatis 100100 'が必要です。私は非常に悪い実行するInsert Selectクエリでこれを行うことができますか、または何らかの種類のキャッシュシステムで行うことができます。 と私はそれが良い方法ではないと思ったら私を修正してください。 –

答えて

0

Linuxサーバーを使用していると仮定します。参照:Creating a RAM disk。 RAMディスクを作成したら、それぞれIDをファイルとしてキャッシュし、sha1()のMACアドレスのハッシュを使用します。 RAMディスクファイルは、まあ、RAMです。すなわち、メモリ内の永続的なキャッシュである。

<?php 
$mac = '54:52:00:27:e4:91'; 
$cache = '/path/to/ramdisk/'.sha1($mac); 

if (is_file($cache)) { // Cached already? 
    $ID = file_get_contents($cache); // From the cache. 
} else { 
    // Run SQL query here and get the $ID. 

    // Now cache the $ID. 
    file_put_contents($cache, $ID); // Cache it. 
} 
// Now do your insert here. 

明確にする:をRAMディスクを使用すると、RAMへの読み取り/書き込みに、このようなfile_get_contents()file_put_contents()として、PHPでファイルシステムのラッパーを使用することができます。考慮すべき


他のより強固な選択肢: