一尘不染

Redis ServiceStack池连接客户端

redis

我正在设计一个将Redis用作数据库的Web服务,并且我想了解使用Redis与StackService客户端连接的最佳实践。

关键是我一直在阅读有关Redis的文章,发现与服务器交互的最佳方法是使用单个并发连接。

问题是,尽管每当Web客户端向Web服务发出请求时,我都会使用 PooledRedisClientManager
,但我又获得了一个到Redis服务器的连接客户端(打开的连接),并且此连接客户端的数量增加了,而又不限制消耗更多更多的内存。

示例“故障”代码:

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

我要解决的问题是创建一个使用静态RedisClientvar
实现单例模式的类;如果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");
}

这是一个好习惯吗?

先感谢您!


阅读 247

收藏
2020-06-20

共1个答案

一尘不染

我用过PooledRedisClientManager并且工作正常:

我只运行一次的 示例代码:

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

和我在许多线程上运行的代码:

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

而且我只有11个客户端连接到服务器。

2020-06-20