发布一个基于TokyoTyrant的C#客户端开源项目

这里开放的是客户端主要功能代码,开源的目的一方面是希望更多的人来学习研究TC和TT,同时大家可以下载本C#源码继续优化提升性能,同时查找BUG,必定本人精力能力有限,而Discuz!NT企业版的功能点又太多(抽空会多写文章进行介绍)实在有些力不从心了,呵呵:)

好了,为了便于使用,下面先对源码中的项目文件进行说明:

      源码包中包括三个项目:
      1.Discuz.EntLib.TokyoTyrant 核心功能代码(目前名空间暂以产品命名)
      2.TTSample 主要用于加载测试数据,并对比SQLSERVER数据库的创建查询功能的速度。
      3.TTSampleConsole 使用核心功能代码的例子(本文中会介绍其中主要功能)

其中Discuz.EntLib.TokyoTyrant中类图如下:

发布一个基于TokyoTyrant的C#客户端开源项目


该客户端有如下特点:
支持TcpClient连接池
支持UTF-8编码
支持初始化链接数,链接过期时间,最大空闲时间,最长工作时间等设置

下面介绍一下如何使用:
1.初始化链接池:

复制代码 代码如下:


pool = TcpClientIOPool.GetInstance("dnt_online");//链接池名称(即DNT在线表)
pool.SetServers(new string[] { "10.0.4.66:11211"});
pool.InitConnections = 8;
pool.MinConnections = 8;
pool.MaxConnections = 8;
pool.MaxIdle = 30000;
pool.MaxBusy = 50000;
pool.MaintenanceSleep = 300000;
pool.TcpClientTimeout = 3000;
pool.TcpClientConnectTimeout = 30000;
pool.Initialize();



2.CRUD操作:
创建一条记录(以DISCUZ!NT在线表字段为例):

复制代码 代码如下:


IDictionary<string, string> columns = new System.Collections.Generic.Dictionary<string, string>();
columns.Add("olid", i.ToString());
columns.Add("userid", i.ToString());
columns.Add("ip", "10.0.7." + i);
columns.Add("username", "用户" + i);
columns.Add("nickname", "用户" + i);
columns.Add("password", "");
columns.Add("groupid", "5");
columns.Add("olimg", "");
columns.Add("adminid", "0");
columns.Add("invisible", "0");
columns.Add("action", "0");
columns.Add("lastactivity", "1");
columns.Add("lastposttime", DateTime.Now.ToString());
columns.Add("lastpostpmtime", DateTime.Now.ToString());
columns.Add("lastsearchtime", DateTime.Now.ToString());
columns.Add("lastupdatetime", DateTime.Now.ToString());
columns.Add("forumid", "0");
columns.Add("forumname", "");
columns.Add("titleid", "0");
columns.Add("title", "");
columns.Add("verifycode", "");
columns.Add("newpms", "0");
columns.Add("newnotices", "0");
TokyoTyrantService.PutColumns(TTPool.GetInstance(), i.ToString(), columns, true);//true表示如tc中有记录则覆盖,没有则创建该记录




查询操作:
首先构程过一个查询(条件)对象,比如查询字段olid = 1的在线用户信息,则该对象定义如下:
new Query().NumberEquals("olid", 1)

然后将其放入TokyoTyrantService的QueryRecords方法中(注意绑定链接池),如下:

var qrecords = TokyoTyrantService.QueryRecords(TTPool.GetInstance(), new Query().NumberEquals("olid", 1));
//遍历当前结果集
foreach (var k in qrecords.Keys)
{
var column = qrecords[k];
...数据绑定操作
}

更复杂的查询,如下(查询forumid = 16 and userid<1000 ,同时按userid字段倒序排列的前三条记录):

qrecords = TokyoTyrantService.QueryRecords(pool, new Query().NumberGreaterThanOrEqual("forumid", 16).
NumberLessThan("userid", 1000).OrderBy("userid", QueryOrder.NUMDESC).LimitTo(3, 0));
这里的比较运行符可以参见源码中的枚举类型,如下:

复制代码 代码如下:


public enum QueryOperation
{
STREQ = 0, // # 查询条件: 表示与操作对象的文字内容完全相同(=)
STRINC = 1, // # 查询条件: 表示含有操作对象文字的内容(LIKE ‘%文字%')
STRBW = 2, // # 查询条件: 表示以操作对象的文字行列开始(LIKE ‘文字%')
STREW = 3, // # 查询条件: 表示到操作对象的文字行列结束(LIKE ‘%文字')
STRAND = 4, // # 查询条件: 表示包含操作对象的文字行列中右逗号分开部分的字段的全部(name LIKE ‘%文字㈠%' AND name LIKE ‘%文字㈡%')
STROR = 5, // # 查询条件: 表示包含操作对象文字段中逗号分开部分的其中一部分(name LIKE ‘%文字㈠%' OR name LIKE ‘%文字㈡%')
STROREQ = 6, // # 查询条件: 表示与操作对象文字段中逗号分开部分的其中某部分完全相同( name = ‘文字㈠' OR name =‘文字㈡')
STRRX = 7, // # 查询条件: 表与与常规表达式匹配
NUMEQ = 8, // # 查询条件: 表示等于操作对象的数值(=)
NUMGT = 9, // # 查询条件: 表示比操作对象的数值要大(>)
NUMGE = 10, // # 查询条件: 表大于或等于操作对象的数值(>=)
NUMLT = 11, // # 查询条件: 表示比操作对象的数值要小(<)
NUMLE = 12, // # 查询条件: 表示小于或等于操作对象的数值(<=)
NUMBT = 13, // # 查询条件: 表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)
NUMOREQ = 14, // # 查询条件: 表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)
NEGATE = 1 << 24, // # 查询条件: 负标志negation flag
NOIDX = 1 << 25 // # 查询条件: 非索引标志
}


查询指定主键(如本例中的olid,效率最高)

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjjdsp.html