当前位置:编程学习 > C#/ASP.NET >>

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

答案:

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

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

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

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

该客户端有如下特点:
支持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,效率最高)
复制代码 代码如下:

var qrecords = TokyoTyrantService.GetColumns(pool, new string[]{"1", "2", "3"});
foreach (string key in qrecords.Keys)
{
var column = qrecords[key];
}

更新操作:
因为TC的TCT结构没有提供直接更新记录中某一字段的功能,所以只能全部取出相关记录的所有字段,然后再更新全部字段(这种做法的效率不高,但在MONGODB中是可以更新部分字段)。所以要组合使用查询和创建操作中的语法,即选查出相应记录,然后再使用PutColumns方法更新该记录,形式如下:
复制代码 代码如下:

var qrecords = TokyoTyrantService.QueryRecords(TTPool.GetInstance(), new Query().NumberEquals("olid", 1));
foreach (var k in qrecords.Keys)
{
var column = qrecords[k];
...数据绑定操作
TokyoTyrantService.PutColumns(TTPool.GetInstance(), column["olid"], columns, true);//column["olid"]为主键,类似数据库里的主键,以其为查询条件,速度最快
}

删除操作
该操作有两种执行方法,一种是选查询出符合条件的记录,然后再删除(依次删除),一种是直接给定要删除的主键直接删除(效率比前者高)。第一种(可以针对不用字段进行查询,并将相应结果的主键做了删除依据)

复制代码 代码如下:

var qrecords = TokyoTyrantService.QueryRecords(TTPool.GetInstance(), new Query().NumberEquals("userid", 1));
foreach (var k in qrecords.Keys)
{
var column = qrecords[k];
...数据绑定操作
TokyoTyrantService.Delete(TTPool.GetInstance(), column["olid"]);//column["olid"]为主键,类似数据库里的主键
}


第二种(删除olid为1或2或3或4的键值记录,只能删除以主键为条件的记录):
TokyoTyrantService.DeleteMultiple(pool, new string[] { "1", "2", "3", "4" });

创建索引
TC中支持几种类型的字段索引如下(经常用的是数值型和字符型):
复制代码 代码如下:

/// <summary>
/// 索引类型
/// </summary>
public enum IndexOption : int
{
LEXICAL = 0, // # 文本型索引
DECIMAL = 1, // # 数值型索引
TOKEN = 2, // # 标记倒排索引.
QGRAM = 3, // #QGram倒排索引.
OPT = 9998, // # 9998, 对索引优化
VOID = 9999, // # 999

上一个:asp.net正则表达式删除指定的HTML标签的代码
下一个:asp.net验证提示美化效果代码(打包下载)

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,