分布式服务器Server.Common封装CSRedisCore实现RedisDBClient 双重检验锁检验初始化CSRedisClient单例

        在使用CSRedisCore类之前要从NuGet里面搜索安装CSRedisCore包后才能使用这个类库。

        自己封装的RedisDBClient代码量很少,基本原理就是在CSRedisCore的基础上封装了一层,使用xml配置里的RedisConnectString去New了一个CSRedisClient,然后这个Redis客户端交给了RedisHelper.Initialization函数去初始化。

        要强调的一点是,单例实例化的过程中考虑到了多线程并发的情况,所以使用了双重检验锁这里判断两次的目的主要是:线程1和线程2同时进入外层的==null逻辑,线程2跑的比线程1块很多,线程2执行了lock(lock_obj),然后走完了初始化,完成后离开了lock块,然后解锁lock_obj对象;线程1才走到判断lock_obj有没有被锁上,这时候线程2结果了,线程1判断应该是没有锁上,会锁上lock_obj,进入lock中的代码块,如果这时候不加m_CurrClient==null,导致的结果 是会 初始化两次m_CurrClient。

老样子贴上RedisDBClient.cs代码

using CSRedis;
using System;
using System.Collections.Generic;
using System.Text;

namespace Servers.Common
{
    //自己封装的RedisClient
    class RedisDBClient
    {
        //锁(这个是用new的对象来当锁)
        private static object lock_obj = new object();

        private static CSRedisClient m_CurrClient = null;

        //初始化Redis客户端
        public static void InitRedisClient()
        {
             
            if (m_CurrClient == null)
            {
                lock (lock_obj)
                {
                    if (m_CurrClient == null)
                    {
                        m_CurrClient = new CSRedisClient(ServerConfig.RedisConnectionString);
                        RedisHelper.Initialization(m_CurrClient);
                    }
                }
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_33531923/article/details/127020642