最近使用java从oracle处理大量BOM数据,中间处理过程使用的sqlite3,但中间处理速度明显过慢。换成redis后,速度提高几个数量级。
正好一个C#的程序处理大量售后数据,需要一些逻辑运算。程序跑了两周还没计算完一半的数据量。当前使用的是SqlServer数据库,现决定修改程序改用redis完成中间运算,再写回SqlServer。
项目加入redis支持
尝试安装过程
打开现有项目,进入“管理解决方案的 NuGet程序包”,输入ServiceStack.Redis
杯具是这安装这个失败了,改用:
可以安装,但运行失败。没找到原因,无奈尝试解决问题。
处理过程
卸载这个NServiceKit.Redis。
卸载NuGet Package Manager
然后重新安装NuGet Package Manager。安装好重启。
再尝试安装:
安装成功。
NServiceKit.Redis项目地址:
https://github.com/NServiceKit/NServiceKit.Redis
讨论组:
https://groups.google.com/forum/#!forum/redis-db
测试代码
string redisHost="127.0.0.1";
RedisClient redis = new RedisClient(redisHost, 6379);
string key = m.order_number;
//redis.Set(key, JsonMapper.ToJson(m)); //需另外引用LitJson http://blog.csdn.net/xundh/article/details/48491109
也可以这样写:
redis.Set<ModelType>(key,m);
遗留问题:
Set大量数据时,会报
Unable to Connect: sPort: 5403
端口数字每次提示不同。使用WireShark发现,每次Set会连接不同redis的端口号。端口会很快被耗完。
解决方案。避免短时间大量的Set操作,改用mset:
static void main(){
//写入
using (RedisClient redis = new RedisClient(redisHost))
{
redis.Db = 1;
redis.ConnectTimeout = 0;
//主体逻辑
ArrayList keys = new ArrayList();
List<byte[]> values = new List<byte[]>();
for(int i=0;i<10000;i++){ //循环
string key = "key"+i;
keys.Add(key);
values.Add(System.Text.Encoding.Default.GetBytes( JsonMapper.ToJson(model)));
}
string[] string_keys = (string[])keys.ToArray(typeof(string));
byte[][] byte_values = values.ToArray();
redis.MSet(string_keys, byte_values);
redis.Quit();
redis.Shutdown();
}
}
批量删除
redis.RemoveByRegex("MTL_SYSTEM_ITEMS_B:.*");