9

Redis をデータベースとして使用する Web サービスを設計しています。StackService クライアントと接続する Redis を使用するためのベスト プラクティスを知りたいです。

要点は、私が Redis について読んでいて、サーバーとやり取りする最良の方法は単一の同時接続を使用することであることがわかったということです。

問題は、Web クライアントが Web サービスにリクエストを行うたびにPooledRedisClientManagerを使用しているにもかかわらず、redis サーバーに接続されたクライアント (開かれた接続) がもう 1 つ取得され、この接続されたクライアントの数が無制限に増加し、さらに多くを消費することです。より多くのメモリ。

サンプルの「障害」コード:

PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
   redisClient.Set("key1", "value1");
}

問題を解決するために私がしたことは、静的変数を持つシングルトン パターンを実装するクラスを作成することRedisClientです。初期化されていない場合はredisClient新しいものを作成し、初期化されている場合は初期化されたものを返します。

解決:

public class CustomRedisPooledClient
{
    private static CustomRedisPooledClient _instance = null;
    public RedisClient redisClient = null;

    // Objeto sincronización para hacer el Lock 
    private static object syncLock = new object();

    private CustomRedisPooledClient()
    {
        redisClient = new RedisClient("localhost");
    }

    public static CustomRedisPooledClient GetPooledClient()
    {
        if (_instance == null)
        {
            lock (syncLock)
            {
                if (_instance == null)
                {
                    _instance = new CustomRedisPooledClient();
                }
            }
        }
        return _instance;
    }
}

CustomRedisPooledClient customRedisPooledClient = CustomRedisPooledClient.GetPooledClient();
using (customRedisPooledClient.redisClient)
{
    customRedisPooledClient.redisClient.Set("key1", "value1");
}

これは良い習慣ですか?

前もって感謝します!

4

1 に答える 1

16

私は使用PooledRedisClientManagerしましたが、正常に動作します:

一度だけ実行するサンプルコード:

static PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");

そして、私が多くのスレッドで実行するコード:

var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
    redisClient.Set("key" + i.ToString(), "value1");
}

サーバーに接続されているクライアントは 11 しかありません。

于 2012-05-15T10:51:30.597 に答える