2

ServiceStack のセッションとキャッシュ メカニズムについて読み始めたばかりなので、何かが足りない可能性があります。ServiceStack で複数の ICacheClient 実装を使用する方法はありますか?

https://github.com/ServiceStack/ServiceStack/wiki/Sessionsおよびhttps://github.com/ServiceStack/ServiceStack/wiki/Cachingによると、次のようにセッション プラグインを追加できます。

public override void Configure(Container container)
{
    Plugins.Add(new SessionFeature());
}

そして、次のように特定の ICacheClient 実装を登録できます。

container.Register<ICacheClient>(new MemoryCacheClient());

私が考えているのは、パフォーマンスを最大化するために大量のセッション状態を維持するステートフル サービスが必要な場合があるかもしれないということですが、より一般的なキャッシュ要件については、Redis のようなものを使用することをお勧めします。

container.Register<IRedisClientsManager>(c => 
    new PooledRedisClientManager("localhost:6379"));
container.Register<ICacheClient>(c => 
    (ICacheClient)c.Resolve<IRedisClientsManager>().GetCacheClient());

しかし、これらを切り替える方法はありますか?プロバイダーを手動で (IoC をバイパスして) 作成し、インメモリまたは Redis キャッシング (他の ICacheClient インスタンスに IoC を使用) に使用する必要がありますか? または、両方の ICacheClient 実装のラッパーを作成し、特別なキー命名パターンのようなものを使用して、メモリ内キャッシュと Redis キャッシュの使用を内部的に切り替えますか?

また、ISession を介したデータへのアクセスをどのように処理しますか? 自動配線された ICacheClient プロパティを直接参照するときに、Redis を使用しながら、インメモリ ICacheClient で ISession を潜在的にバックアップできますか?

4

1 に答える 1

3

サービススタックのセッション状態は、ICacheClient を使用して維持されます。サービススタックがキャッシュに使用するプロバイダーを決定し、説明したようにこれを設定する必要があります-つまり、Memcached:

container.Register<ICacheClient>(new MemoryCacheClient());

別のタイプのキャッシングを使用したい場合は、次のように IOC に登録します。

container.Register<ICacheClient>(new MemoryCacheClient());  // For servicestack session state

//REDIS for other caching options
container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
container.Register<IREDISClient>(c => (IREDISClient)c.Resolve<IRedisClientsManager>().GetClient());

異なるクラスは、必要な Caching インターフェイスを定義することで、最も適切なキャッシング プロバイダーを使用します。

public ICacheClient Cache { get; set; }

また

public IREDISClient REDISCache { get; set; }

socialbootstrap プロジェクトで示されているように、servicestack サービス クラスを拡張し、独自の appservicebase を作成することで、両方をサービスで利用できるようにすることができます。その後、両方のキャッシュ モデルを使用可能にすることができます。

私はすべてのキャッシングに REDIS を使用しています。これは私のニーズに十分に対応できる速度であり、マルチサーバー アーキテクチャでは、ユーザー セッションを失うことなくメンテナンスのためにサーバーを停止できます。

標準 REDIS クライアント (ICacheClient に接続) とネイティブ REDIS クライアント (IRedisNativeClient に接続) の 2 つのキャッシュ プロバイダーがまだあります。これは、標準の REDIS クライアントで採用されているシリアライゼーションが、一時的に永続化する必要がある一部の非 POCO オブジェクトで機能しないためです。

于 2013-03-19T21:38:45.630 に答える