4

json データのリストを redis に保存し、ServiceStack c# クライアントを使用してアクセスしています。私は基本的に自分の外部キーを管理しています。ここではzrange、ID を保存し、アプリケーション内部のインターフェイスを使用して ID をzrange取得し、Redis から基になる json オブジェクトを取得し、それらをリストとしてパッケージ化して他の部分に戻します。私のアプリケーションの。

PooledRedisClientManagerコードを実行しているサーバーとは別のサーバーでRedisがホストされると予想されるため、を使用しています。

MSOpenTech Redis サーバーを使用して、すべての開発作業を Windows 8 でローカルに行っています。現在、私の最大の課題は、クライアント接続が閉じられていないことです。

IRedisClientManagerRedis パーシスタに(IoC is CastleWindsor)のインスタンスが挿入されています。このコードは、Azure ワーカー ロールのコンテキストで実行されます。

これは、zrangeからアイテムを取得する方法です:

public class MyRedisPersister<T> : IResourcePersister<T>
{ 
    IRedisClientManager _mgr;
    public MyRedisPersister(IRedisClientManager mgr)
    {
        _mgr = mgr;
    }

    public IResourceList<T> Get<T>(string key, int offset, int count) where T
    {
        using (var redis = _clientManager.GetClient())
        {
            var itemKeys = redis.GetRangeFromSortedSet(key, offset, offset + count - 1).ToList();
            var totalItems = redis.GetSortedSetCount(key);

            if (itemKeys.Count == 0)
            {
                return new ResourceList<T>
                    {
                        Items = new List<T>(),
                        Offset = 0,
                        PageSize = 0,
                        TotalItems = 0,
                        TotalPages = 0
                    };
            }
            else
            {
                return new ResourceList<T>
                    {
                        Items = itemKeys.Select(k => redis.Get<T>(k)).ToList(),
                        Offset = offset,
                        PageSize = count,
                        TotalItems = totalItems,
                        TotalPages = (int) Math.Ceiling((float) totalItems/count)
                    };
            }
        }
    }
}

これは、私が登録するために使用するコードですIRedisClientManager

var mgr = new PooledRedisClientManager(100, 10, "localhost:6379");
container.Register(Component.For<IRedisClientsManager>().Instance(mgr).LifeStyle.Singleton);

どんな助けでも大歓迎です。

4

2 に答える 2

8

現在、私の最大の課題は、クライアント接続が閉じられていないことです。

「PooledRedisClientManager」を使用しているため、クライアント接続を閉じてはならず、再利用のためにプールに入れるだけであると理解しています。プール サイズは 100 接続のようです。

var mgr = new BasicRedisClientManager("localhost:6379") クライアントを破棄する必要があるを使用して試すことができ ます。

于 2013-02-13T19:04:03.210 に答える
2

編集以下のアプローチは推奨されません。IRedisClientsManager に依存し、すべての redis クライアント呼び出しを using() ブロック内にラップする必要あります。そうしないと、グレムリンに噛まれます。

私は、Windsor を PooledRedisClientsManager でうまく動作させるのに同様の問題を抱えていましたが、最終的にはこれがうまくいくように見えました:

        container.Register(
            Component.For<IRedisClientsManager>()
                     .Instance(redisClients)
                     .LifestyleSingleton(),

            Component.For<IRedisClient>()
                     .UsingFactoryMethod(c => c.Resolve<IRedisClientsManager>().GetClient(),
                                        managedExternally: true));
    }

managedExternally パラメーターは、Windsor に廃止措置の懸念を IRedisClients に適用しようとせず、PooledRedisClientsManager がリサイクルを処理するように指示します。

于 2013-02-20T13:43:33.540 に答える