Discuz!NT千万级数据量上的两驾马车 TokyoCabinet,MongoDB

2019-02-18 00:52:00王振洲

    2.考虑到有些用户公司是有相应技术储备的,两种方案也便于用户公司进行的技术选型(当然因为采用接口方式,用户完全可以引入其它第三方的NOSQL工具来实现)。

    好了,说了这么多,开始今天的正文吧。
   
    前面说过,该方案使用了接口方式,这里就先看一下相应的接口声明:
    
       
   

     可以看到,目前在企业版中,对主题表(dnt_topics),用户表(dnt_users),在线表(dnt_online)以及帖子表(dnt_posts)进行了NOSQL数据支持,所以定义了如下的几个接口(图中):


public interface ICacheTopics
public interface ICacheUsers
public interface ICacheOnlineUser
public interface ICachePosts

因为目前只是把这类NOSQL工具当作高级的‘缓存’来用,所以接口命名上都带着‘Cache’的字样。
然后我使用了一个叫做DBCacheService的类,提供获取这几个接口实例的方法,比如ICacheTopics的实例代码如下:


/// <summary>
/// 该类用于获取NoSqlDb声明的缓存服务
/// </summary>
public class DBCacheService
{
static ICacheTopics iCacheTopics = null;
public static ICacheTopics GetTopicsService()
{
if (iCacheTopics == null)
{
lock (lockHelper)
{
if (iCacheTopics == null)
{
try
{
if (EntLibConfigs.GetConfig().Cachetopics.Enable)
{
iCacheTopics = (ICacheTopics)Activator.CreateInstance(Type.GetType(
EntLibConfigs.GetConfig().Cachetopics.CacheType == 2 ?
"Discuz.EntLib.TokyoTyrant.Data.Topics, Discuz.EntLib.TokyoTyrant" :
"Discuz.EntLib.MongoDB.Data.Topics, Discuz.EntLib.MongoDB", false, true));
}
}
catch
{
throw new Exception("请检查" + (EntLibConfigs.GetConfig().Cachetopics.CacheType == 2 ?
"Discuz.EntLib.TokyoTyrant.dll" :
"Discuz.EntLib.MongoDB.dll") + "文件是否被放置到了bin目录下!");
}
}
}
}
return iCacheTopics;
}
}

从上面代码可以看出,使用反射方式获取相应DLL文件(分别是Discuz.EntLib.TokyoTyrant.dll和Discuz.EntLib.MongoDB.dll)中的 类信息并初始化该实例。当然,这里还定义了一个配置文件,也就是EntLibConfigs.GetConfig()这个方法所获取的配置文件信息, 相应 配置文件内容包括:


/// <summary>
/// 提供数据库缓存服务,将在线表主题表这类大表放入缓存之中
/// </summary>
public class DBCache
{
/// <summary>
/// 是否有效
/// </summary>
public bool Enable = false;
/// <summary>
/// 服务地址
/// </summary>
public string Host = "";
/// <summary>
/// 服务地址
/// </summary>
public int Port = 0;
/// <summary>
/// 链接池名称
/// </summary>
public string PoolName = "dnt";
/// <summary>
/// 初始化链接数
/// </summary>
public int IntConnections = 4;
/// <summary>
/// 最少链接数
/// </summary>
public int MinConnections = 4;
/// <summary>
/// 最大连接数
/// </summary>
public int MaxConnections = 4;
/// <summary>
/// avaiable pool池中线程的最大空闲时间
/// </summary>
public int MaxIdle = 30000;
/// <summary>
/// busy pool中线程的最大忙碌时间
/// </summary>
public int MaxBusy = 50000;
/// <summary>
/// 维护线程休息时间
/// </summary>
public int MaintenanceSleep = 300000;
/// <summary>
/// TcpClient读操作超时时间
/// </summary>
public int TcpClientTimeout = 3000;
/// <summary>
/// TcpClient链接超时时间
/// </summary>
public int TcpClientConnectTimeout = 30000;
/// <summary>
/// 缓存类型1为mongodb,2为tokyotyrnat
/// </summary>
public int CacheType = 1;
}