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. SQLI DUMB SERIES-1

    less-1 (1) 可以看到提示输入ID,而且less-1题目也有提到GET,因此试试以下操作: http: 结果: http: 结果: 现在可知,“ ' ”并没有被过滤,因此可以进行以下操作: h ...

  2. bulma入门

    http://www.ruanyifeng.com/blog/2017/10/bulma.html

  3. 斐波那契 - pythoon实现

    def fn_1(n): if n == 0 : return n elif n == 1 : return n else: a = [0,1] for i in range(2,n): a.appe ...

  4. Redis 当成数据库在使用和可靠的分布式锁,Redlock 真的可行么?

    怎样做可靠的分布式锁,Redlock 真的可行么? https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html ...

  5. How to do distributed locking

    How to do distributed locking 怎样做可靠的分布式锁,Redlock 真的可行么? 本文是对 Martin Kleppmann 的文章 How to do distribu ...

  6. BinarySearch(Java)

    private int binarySearch(int[] input, int target) { if (input == null) { return -1; } int index1 = 0 ...

  7. EasyUI datagrid combox onchange 五

    $("#sTwo").combobox({ onChange: function (n,o) { n改变后,o改变前 }

  8. hdu1159 dp(最长公共子序列)

    题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根 ...

  9. javaweb防止表单重复提交

    参考孤傲苍狼 https://www.cnblogs.com/xdp-gacl/p/3859416.html 场景一:在网络延迟的情况下让用户有时间点击多次submit按钮导致表单重复提交 场景二:表 ...

  10. (惊艳)基于谷底最小值的阈值的图像分割(改进HSV中的H分量可以用imhist(H)提取)

    任务概述:将这张图片作为输入 , 然后抠出只有斑点的图片 灵感来源: 1. 黄色部分用绿色的掩盖掉得到图片B,然后A和B进行∩运算,相同的设置为0 2.统计单词的子母数,开辟一个26个元素的数组,进来 ...