代做网页制作网站,管网建设方案,seo标题优化的心得总结,网站竞价开户前言很多时候#xff0c;我们会根据用户最近一段时间的行为#xff0c;做出一些相应的策略#xff0c;从而改变系统的运动轨迹。举个简单的例子来说明一下#xff1a;假设A公司现在有两个合作伙伴(B和C)#xff0c;B和C都是提供天气数据的#xff0c;现在A公司做了一个聚… 前言很多时候我们会根据用户最近一段时间的行为做出一些相应的策略从而改变系统的运动轨迹。举个简单的例子来说明一下假设A公司现在有两个合作伙伴(B和C)B和C都是提供天气数据的现在A公司做了一个聚合接口把B和C的接口融合了那么这个时候要怎么去B和C公司获取数据呢其实这个要考虑的东西有很多很多下面根据本文的主题拿出其中一个点来讨论说明。最简单的做法就是随机调用。当然不是那么简单的随机调用。根据调用的最近一百条数据的得到成功率耗时等指标再根据这些指标去判断一次查询要去那个公司获取数据。思路已经有了这个时候就是怎么实践的问题了。本文介绍的做法是借助redis来完成的。如何用redis来处理redis的list类型可以说非常适合用来处理这个情况。首先可以把查询按顺序写进去一个个的入队。其次写进去之后可以对它进行裁剪保留最近的100条数据。(换句话说我们可以保证在这个list里面最多就是100条数据)最后获取这个list里面的100条数据进行计算即可。正常情况下我们不会把计算放在查询的过程里面在查询的时候只需要一个决策的结果值就可以了当然这个结果值也是计算后写进redis的。所以要将这个计算的过程从查询中独立出来定时去执行即可。总结上面所说的大概可以画出下面这样一样图。其中的第三步操作将查询记录写进list然后进行裁剪这两个操作可以直接操作redis也可以考虑通过MQ去写虽说没什么太大的必要。简单的示例代码查询的控制器[Route(api/[controller])][ApiController]public class AreaController : ControllerBase{ private readonly ILogger _logger; private readonly IRedisCachingProvider _provider; public AreaController(ILoggerFactory loggerFactory, IRedisCachingProvider provider) { _logger loggerFactory.CreateLoggerAreaController(); _provider provider; } [HttpGet(provinceId)] public async Taskstring GetAsync(string provinceId) { var datasource await GetQueryDataSourceIdAsync(provinceId); if (string.IsNullOrWhiteSpace(datasource)) return not support; var beginTime DateTime.Now; var (val, isSucceed) await QueryDataSourceAsync(datasource); var endTime DateTime.Now; var dsInfo new DataSourceInfo { Cost (long)endTime.Subtract(endTime).TotalMilliseconds, IsSucceed isSucceed }; _ Task.Run(async () { try { await _provider.LPushAsync($info:{datasource}, new ListDataSourceInfo { dsInfo }); await _provider.LTrimAsync($info:{datasource}, 0, 99); } catch (Exception ex) { _logger.LogError(ex, $record #{datasource}# error); } }); return val; } private async Taskstring GetQueryDataSourceIdAsync(string provinceId) { var datasourceIds GetDataSourceIdProvinceId(provinceId); if (datasourceIds.Count 0) return string.Empty; var cacheKey dskpi; var kpis await _provider.HMGetAsync(cacheKey, datasourceIds); var datasource datasourceIds.First(); if (kpis ! null kpis.Any()) { datasource kpis.OrderByDescending(x x.Value).First().Key; } return datasource; } private async Task(string val, bool isSucceed) QueryDataSourceAsync(string datasource) { await Task.Delay(100); var rd new Random().NextDouble(); return (datasource, rd 0.5d); } private Liststring GetDataSourceIdProvinceId(string provinceId) { return new Liststring { 100, 900 }; }}由调度系统触发的计算控制器也可以在Github上面找到上面的示例代码 RecentRecordsDemo