2

データのリストをキャッシュに保存する必要があります。

完全なリストが必要な場合もあれば、結果を照会してリストから1つのアイテムを返すだけでよい場合もあります。

1つのアイテムの現在のロジックは次のとおりです。

User result;
var cachedUsers = _cache.Get<List<User>>(Constants.Cache.UsersKey);
if( cachedUsers != null)
{
    result = cachedUsers.FirstOrDefault(u => u.UserID == userID);

    if (result != null)
        return result;
}

result = GetUserFromDb(userID);

if (cachedUsers != null)
{
    cachedUsers.Add(result);
    _cache.Store(StoreMode.Set, Constants.Cache.UsersKey, cachedUsers);
}

return result;

ユーザーの完全なリストをロードせずに、キャッシュから1つの要素に直接アクセスできますか?また、完全なリストを読み込んで上書きせずに、ユーザーをキャッシュに追加するロジックも必要です。

編集:リストとは別にアイテムを保存するか、別のアプローチでキャッシュを最初から書き込むオプションがあります。

このロジックを実装するための最良の方法は何ですか?

4

2 に答える 2

2

実行できる最も詳細なアクションは、特定のキーを取得することです。そのキーの下にアイテムのリストを保存すると、リストが表示されます。アイテムを1つだけ取得するには、キーごとにアイテムを保存する必要があります。

これにはさまざまな戦略がありますが、原子性はキーレベルにあるため、複数のキー間でアクションを実行すると競合状態が発生する可能性があることに注意してください。

個人的には、(デフォルトの.NETシリアル化に依存するのではなく)リストをカスタムシリアル化するので、これはかなり高速です。ただし、これは、個々のキーの更新または個々のキーの要求について話しているときに「時々」何回あるかによって異なります。ここでは、「使いながら保管する」という常識が当てはまります。

カスタムシリアル化の場合、Protobuf-netを使用して、結果byte[]を手動でキャッシュに保存します。のように、キャッシュはを取得して提供し、byte[]手動でシリアル化を実行します。

于 2012-08-29T10:44:57.950 に答える
1

簡単な答えはノーです。リスト全体をキャッシュしましたが、キャッシュはdumb、データのブロックをキャッシュしただけで、何をキャッシュしたかを認識していません。あなたはそれをすべて引き戻す必要があります。

ただし、これを回避するには、キーのパターンを設定してアイテムを個別にキャッシュしてから、リストインデックスを個別にキャッシュします。ただし、管理するのはやや面倒で、複数のオブジェクトがすべて独自のキャッシュライフタイムを持っています。

于 2012-08-29T10:45:06.737 に答える