Task是一个很好用的多任务处理类,并且通过Task可以对任务进行很好的控制。

下面将通过代码实现Redis集群在使用IServer.keys时通过多任务对多个服务器示例进行并行计算,并对返回key做汇总计算。

对于主从双服务器的redis使用keys可以很方便的取到所提供的正则匹配KEY集合,但在redis集群中每次只能获取一个redis实例匹配keys,如果先去遍历所有服务器则会十分慢,并且容易出现超时计算,这时我们就用Task为每台Reids服务器做一个异步的Task等待最后一个处理完汇总数据,这样可以大大提升效率。

当然应用在其他地方也是可以的用在任何大批量处理的程序中,掌握Task的使用可谓是一劳永逸。

定义一个异步方法读取redis节点的key

 /// <summary>
/// 异步任务获取单个Redis匹配keys
/// </summary>
/// <param name="endpoint">redis节点</param>
/// <param name="pattern">匹配的key例如:key:*</param>
/// <returns></returns>
public async Task<RedisKey[]> GetdkeysbyServer(EndPoint endpoint, string pattern)
{
var server = RdsCon.GetServer(endpoint);
if (server.IsConnected)//判断节点是否可以连接
{
if (server.IsSlave)//判断是否为主库,因为存在很多从库,主库断掉后从库会充当主库,所以这里只检查主库数据
{
return null;
}
}
else
{
return null;
}
var keys = server.Keys(database: Database.Database, pattern: pattern).ToArray();
return keys;
}

封装新的keys查询方法

这里主要用到Parallel.ForEach,可以动态创建多个Task,也可以使用Parallel.For。重点:切记这里不能用单纯的for 或者foreach去循环创建Task,即使可以创建,会发现在异步取数据时从第二次年开始每个任务所执行的内容都是相同的。

 /// <summary>
/// 查找所有符合给定模式 pattern 的 key;KEYS * 匹配数据库中所有 key;KEYS h?llo 匹配 hello,hallo等。KEYS h[ae]llo匹配hello和hallo
/// </summary>
/// <param name="pattern"></param>
/// <returns></returns>
public string[] Keys(string pattern)
{
List<RedisKey> listkey = new List<RedisKey>();
List<Task<RedisKey[]>> arrayTask = new List<Task<RedisKey[]>>();
Parallel.ForEach(RdsCon.GetEndPoints(), item =>
{
Task<RedisKey[]> newtask = GetdkeysbyServer(item, pattern);
if (newtask != null)
{
arrayTask.Add(newtask);
}
}); Task.WaitAll(arrayTask.ToArray());
foreach (var taskitem in arrayTask)
{
if (taskitem.Result != null)
{
listkey.AddRange(taskitem.Result);
}
} return listkey.Select(e => (string)e).ToArray<string>();
}

.NET使用Task动态创建多任务多线程并行程序计算Redis集群keys计算的更多相关文章

  1. 重新创建redis集群的注意事项

    一.重新创建redis集群的注意事项 1.将每个节点下aof.rdb.nodes.conf本地备份文件删除: 2.127.0.0.1:7001> flushdb #清空当前数据库(这一步可以省略 ...

  2. kubernetes实战(九):k8s集群动态存储管理GlusterFS及使用Heketi扩容GlusterFS集群

    1.准备工作 所有节点安装GFS客户端 yum install glusterfs glusterfs-fuse -y 如果不是所有节点要部署GFS管理服务,就在需要部署的节点上打上标签 [root@ ...

  3. Redis集群创建和配置

    1.检查GCC是否安装,可以看看版本号 gcc -v 安装命令:yum install gcc-c++ 2.安装Ruby和Rubygems 如果有网的话,则通过yum命令进行安装,自动将关联的依赖包全 ...

  4. 四十.创建Redis集群 管理集群

    环境准备 准备 6台(51-56) redis服务器  以默认配置运行redis服务即可  一.创建Redis集群 1.启用集群功能( 51-56 都要配置) ]#  netstat -antupl ...

  5. redis集群创建时报错:Sorry, can't connect to node

    1.redis集群创建时报错:Sorry, can't connect to node ip,端口等都配置正确的话,还需要将redis.conf文件中的密码注释掉    # requirepass 1 ...

  6. 如何创建redis集群

    1.下载redis源码包 wget http://download.redis.io/releases/redis-3.2.4.tar.gz 2.解压并安装 tar xvf redis-.tar.gz ...

  7. AWS 创建redis 集群模式遇到的问题

    问题描述 前几天在aws 平台创建了Redis 集群模式,但是链接集群的时候发现无法连接,返回信息超时. 通过参数组创建redis的时候提示报错:Replication group with spec ...

  8. redis 集群创建常见几个问题

    Redis配置集群遇到问题及解决方法   配置完所有主节点后,报" ERR Invalid node address specified" 由于Redis-trib.rb 对域名或 ...

  9. 创建redis集群

    假设你已经安装好了redis ,如果还没有请安装 将多个实例跑起来 创建一个目录,比如 redis-cluster 把redis-server拷贝到这个目录下 在目录下为每一个实例创建一个文件夹 在每 ...

随机推荐

  1. SQL Server导入导出表及备份恢复

    1.   导出: 2.   导入

  2. 1111B - Average Superhero Gang Power

    刷数学题不知道为啥出来这个 算是贪心吧,先把所有的power加起来,然后sort一遍,每次删掉最小的那个数,记录一个max,平均值ave如果比max大,就替换,一定要小心m的值可能会比n小,意味着不一 ...

  3. .net core consul grpc--系统服务RPC实现通信(一)

    .net core grpc 系统服务实现通信(一) 现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/ ...

  4. R49 A-D D图有向有环图

    A. Palindromic Twist 给一个字符串(小写字母)   每个字符+1,-1:变成其他字符  a只能变b  z只能变y 看能否变成回文字符串 #include<bits/stdc+ ...

  5. c# 自定义log4net过滤器

    有时候为了实现自己想要的多个日志文件记录不同的内容,可能需要自定义log4net过滤器,比如我这里需要记录三个文件,这三个文件的内容又不能重复,多次尝试未果. 为了不更改任何现有日志代码的情况下,于是 ...

  6. centos7配置openldap服务器

    参考链接 https://www.cnblogs.com/bigbrotherer/p/7251372.html 上面这篇参考文件在最后登录是有问题的 vi /etc/openldap/sldap.c ...

  7. buckaroo 去中心化的c++包管理工具

    buckaroo 是一款去中心化的c++ 包管理工具,使用上,类似yarn(nodejs),cargo (rust) ,使用buckaroo 我们可以很容易集成一个大规模的项目 支持以下特性 直接从G ...

  8. 使用InternalsVisibleToAttribute给assembly添加“友元assembly”特性遭遇"强签名"

    一.如何让Intenal成员暴露给另一个程序集 我们知道Modifier为Internal的类型成员仅限于当前程序集能够访问,但是在某些情况下,我们希望将它们暴露给另一个程序集.比较典型的应用场景包括 ...

  9. 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同

    思路:利用&用算加右移的方法来提取二进制中的每一位数,然后进行比较,查看是否相同. #include<stdio.h> #include<stdlib.h> int m ...

  10. 编译opencv python

    1, 下载并且安装python2.7 + numpy 2,运行cmakegui打开opencv.应该要显示如下信息: Python 2: Interpreter: C:/Python27/python ...