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. s21day01 python笔记

    s21day01 python笔记 一.计算机基础 计算机的初步认识 用户:人 软件:QQ.浏览器等 解释器/编译器/虚拟机:java解释器.python解释器等 操作系统 硬件:CPU.内存.硬盘. ...

  2. JAVA:形参与实参

    今天百度startWith函数的用法,无意中看到了形参这个称呼,因此就去了解了下形参与实参. 在传值机制中,其实就是把变量b(实参)的地址传递给了形参(也就是实参跟形参都是用的同一个地址,在传值之前形 ...

  3. Blender界面及模式统计

    Blender2.79b安装后默认界面分布: 所有窗口: 窗口: 3D View的9种模式:

  4. (23)ajax实现上传文件的功能

    form表单上传文件 urls.py from django.conf.urls import urlfrom django.contrib import adminfrom app01 import ...

  5. Js 字符串的三大操作

    回顾: var num = str.length:字符个数 str = str.toLowerCase()/toUpperCase() var char = str.charAt(index)  :指 ...

  6. DBUtils和连接池

    今日内容介绍 1.DBUtils 2.连接池 ###01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数 ...

  7. s3c2410串口笔记

  8. python Console menu

    I just finished a demo which is to provide an easy way to control hardware resources of A sample. Th ...

  9. Monte Carlo tree search 学习

    https://en.wikipedia.org/wiki/Monte_Carlo_tree_search 蒙特卡洛树搜索(MCTS)基础 http://mcts.ai/about/index.htm ...

  10. LoadRunner手写脚本、检查点、集合点、事务、思考时间

    手写脚本 什么时候要手写? 可以有条件手写脚本的场景有两类: 有接口说明文档 没有借口说明文档,要去录制,录制不了,抓包手写 所需函数 我们这里讲的例子是基于 http 协议的,也是常见的两种请求类型 ...