2

私は頭がおかしくなっていると思います。データベースクエリをキャッシュするためにZend_Cacheを実装しようとしています。私はそれがどのように機能し、どのように構成するかを知っています。

しかし、キャッシュエントリの識別子を設定する良い方法が見つかりません。データベース内のレコードを検索するメソッドがあります(検索値を持つ配列に基づいて)。

/**
 * Find Record(s)
 * Returns one record, or array with objects
 *
 * @param array   $search Search columns => value
 * @param integer $limit  Limit results
 * @return array One record , or array with objects
 */
public function find(array $search, $limit = null)
{
    $identifier = 'NoIdea';

    if (!($data = $this->_cache->load($identifier))) {
        // fetch
        // save to cache with $identifier..
    }

しかし、この状況ではどのような識別子を使用できますか?

4

4 に答える 4

3

識別子は、キャッシュエントリを表す一意の文字列である必要があります。

データベースのテーブルとフィールドに基づいて名前を付けることができます。db_tablename_primarykey_1

複数の引数を持つメソッドがある場合、それらすべてを含む文字列を作成するのは面倒です。または、関数の引数とdb_tablenameを連結して、ハッシュ用の文字列を生成することもできます。例えば:

$identifier = md5('db_tablename_find' . serialize(func_get_args()));
于 2009-12-16T00:24:48.350 に答える
1

私はこれと同じ問題を抱えています。あなたがまだ解決策を見つけたかどうかはわかりませんが、私は一時的な解決策を持っています(それはあまり効率的ではないため):

  1. クエリを実行するテーブルごとにキャッシュディレクトリを作成し、結果をキャッシュします。

  2. そのテーブルをクエリするときは常に、一意のIDを使用して結果を保存してください。これが私の解決策の問題です。クエリが長すぎる可能性があり、一部のオペレーティングシステムがそれを拒否する可能性があるため、クエリをIDとして使用することはできません。だから私が思いついたのは、次のように、すべてのクエリを自動インクリメントIDとともに別のファイルに保存することです。

    0->>SELECT * FROM table
    1->>SELECT * FROM table WHERE foo = bar
    

あなたはその考えを理解します。したがって、クエリを実行する前に、そのファイルをチェックして、現在のクエリが存在するかどうかを確認します(存在する場合)。IDを取得し、そのIDを使用してロードします。このファイルは同じキャッシュディレクトリに保存できます。

  1. そのテーブルのデータを更新、挿入、または削除するときはいつでも、$ cache-> clean('all')のようにキャッシュされたレコードをクリーンアップするだけです。同じクエリが実行されるため、IDのファイルを削除する必要はありません。そして、不思議に思うかもしれませんが、それはそのディレクトリ内のキャッシュファイルのみをクリーンアップするので、すべてのテーブルにディレクトリが必要です。

いいもの。更新、挿入、または削除を実行するたびに自分でキャッシュをクリーンアップするため、ライフタイム(永久に存在する可能性があります)を設定したり、キャッシュを自動クリーニングしたりする必要はありません。

ぶさいく。テスト、ロード、または保存は、ファイルシステムに対して2つ(または、新しいクエリのために新しいIDを保存する必要がある場合は3つ)の要求を行います。

私はこれを使用しましたが、Zend_Cache_CoreとZend_Cache_Backend_Fileを使用して正常に動作します。私は完全なフレームワークを使用していませんが、Zend_Cacheモジュールを使用しているため、フレームワーク全体を使用する場合は、モデルの子クラスのディレクトリ、IDファイル、およびキャッシュの作成を行う抽象モデルクラスを作成する必要があります。 (それからそれを拡張します)。

ここで、md5を使用することが、すべてのテーブルに対してIDファイルを作成する必要がある解決策になる可能性があることを確認しました。試してみて、折り返しご連絡します。これがApcでどのように機能するかわかりません。

于 2010-06-21T01:58:58.210 に答える
1

Zend CacheにFunctionフロントエンドを使用することを検討することをお勧めします。ここでは、次のようなことができます。

$cache->call('veryExpensiveFunc', $params);

キーは自動的に生成されます(ただし、長めのキーになる可能性があります)。クラスのすべてのメソッドを透過的にキャッシュできるクラスフロントエンドを使用できます。

于 2010-02-10T17:57:42.903 に答える
0

基になるデータが変更されるとどうなりますか?さて、該当するすべてのキャッシュレコードを廃棄する必要があります。それはワームのモンド缶です!

このデータキャッシングをRDBMSにオフロードするのはどうですか?

たとえば、MySQLクエリキャッシュはこれを処理し、必要に応じて古いキャッシュレコードを無効にします。

于 2009-12-16T21:12:40.367 に答える