在使用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); } } } } } }