当前位置: 首页 > wzjs >正文

辽宁建设工程信息网官网新网站是哪个百度联盟注册

辽宁建设工程信息网官网新网站是哪个,百度联盟注册,用ps怎么做网站首页,开原网站制作最近做的头条项目其中有个功能是创作者发表的文章可以设置在未来某个时间发表,在实现这个功能的时候就在想该怎么实现呢?刚开始想的是利用Spring的定时任务定时的去数据库中查询,可以这个查询频率该怎么设置,每次从数据库中需要查…

最近做的头条项目其中有个功能是创作者发表的文章可以设置在未来某个时间发表,在实现这个功能的时候就在想该怎么实现呢?刚开始想的是利用Spring的定时任务定时的去数据库中查询,可以这个查询频率该怎么设置,每次从数据库中需要查询文章延迟发布表的全部信息,未免有点太消耗时间了,况且MySQL还是存在本地磁盘的,读取成本过高。

这个时候我就想既然遇到了读写速度问题,就要找缓存来解决了,利用Redis存储在内存的特性,将马上就要发布的文章信息存进Redis中,利用定时任务一分钟查询一次缓存,查看是否有要发布的文章,拉取对应的文章信息进行审核发布

我在redis中使用两种数据结构来存储文章发布信息

list 是一个简单的字符串列表,按照插入顺序排序。你可以在列表的头部(左边)或尾部(右边)插入元素。

 使用list存储发布时间小于等于当前时间也就是立刻就要发布的文章,每次都从列表的左边插入文章信息,定时任务消费的时候从右边拉取数据,以形成一定的时间顺序

 zset 是一种特殊的集合,它和普通集合一样,成员都是唯一的,但每个成员都会关联一个分数(score),Redis 会根据分数对成员进行从小到大的排序。

zset和list的区别就是元素唯一,并且每个元素绑定一个分数, 该集合会根据分数的大小进行排序,正好就可以把文章的预发布时间当作score,这样每次取score最小的文章也就是最早要发布的文章,符合业务逻辑

延迟发布任务的存储处理

处理流程如上图所示,当有用户发起文章发布请求时

1 先将文章相关的信息存入本地数据库中做备份(防止因为系统或断电导致缓存丢失)

2 然后判断文章的预发布时间

        如果小于等于当前时间,直接放入list中等待定时任务消费

        否则如果发布时间在未来五分钟以内,放入zset中

    public long addTask(Task task) {//先存储进本地数据库boolean success=addTaskToDb(task);//存进缓存if(success){addTaskToCache(task);}return task.getTaskId();}/*** 把任务添加到redis中** @param task*/private void addTaskToCache(Task task) {String key = task.getTaskType() + "_" + task.getPriority();//获取5分钟之后的时间  毫秒值Calendar calendar = Calendar.getInstance();calendar.add(Calendar.MINUTE, 5);long nextScheduleTime = calendar.getTimeInMillis();//2.1 如果任务的执行时间小于等于当前时间,存入listif (task.getExecuteTime() <= System.currentTimeMillis()) {cacheService.lLeftPush(ScheduleConstants.TOPIC + key, JSON.toJSONString(task));} else if (task.getExecuteTime() <= nextScheduleTime) {//2.2 如果任务的执行时间大于当前时间 && 小于等于预设时间(未来5分钟) 存入zset中cacheService.zAdd(ScheduleConstants.FUTURE + key, JSON.toJSONString(task), task.getExecuteTime());}}//MySQL数据private boolean addTaskToDb(Task task) {//用来标记是否存储成功boolean flag = false;try {//保存任务表Taskinfo taskinfo = new Taskinfo();BeanUtils.copyProperties(task, taskinfo);taskinfo.setExecuteTime(new Date(task.getExecuteTime()));taskinfoMapper.insert(taskinfo);//设置taskIDtask.setTaskId(taskinfo.getTaskId());//保存任务日志数据TaskinfoLogs taskinfoLogs = new TaskinfoLogs();BeanUtils.copyProperties(taskinfo, taskinfoLogs);taskinfoLogs.setVersion(1);taskinfoLogs.setStatus(ScheduleConstants.SCHEDULED);taskinfoLogsMapper.insert(taskinfoLogs);flag = true;} catch (Exception e) {e.printStackTrace();}return flag;}

以上仅仅只是请求到来后初步的处理,当消费列表list中的文章发布任务处理完毕后怎么办呢?

Redis数据处理

针对Redis中zset的数据(未来五分钟内发布的文章),需要每分钟查询是否有发布时间小于等于当前时间的,然后从zset中移动到list中

这就涉及到Redis列表的搜索算法了,目前常用的匹配对应元素的方法有keys 的模糊匹配、Scan扫描,由于keys模糊匹配非常占用CPU的时间,所以一般使用SCAN扫描符合要求的数据

当用户数据量较大是,如果从zset中一条一条的将文章发布任务移动到list中也很占用时间,恰好Redis提供了Pipeline请求服务,可以一次传送大量数据,大大节省时间

(同时,基于分布式的软件架构下可能有多个端同时处理文章预发布信息,这里使用redis的分布式锁,占用时间三十秒)

定时任务代码如下

    @Scheduled(cron = "0 */1 * * * ?")public void refresh() {//使用redis的分布式锁,三十秒后结束String token= cacheService.tryLock("FUTURE_TASK_SYNC", 1000 * 30);if(StringUtils.isNotBlank(token)){System.out.println(System.currentTimeMillis() / 1000 + "执行了定时任务");// 获取所有未来数据集合的key值,使用scan而非keysSet<String> futureKeys = cacheService.scan(ScheduleConstants.FUTURE + "*");// future_*for (String futureKey : futureKeys) { // future_250_250String topicKey = ScheduleConstants.TOPIC + futureKey.split(ScheduleConstants.FUTURE)[1];//获取该组key下当前需要消费的任务数据Set<String> tasks = cacheService.zRangeByScore(futureKey, 0, System.currentTimeMillis());if (!tasks.isEmpty()) {//将这些任务数据添加到消费者队列中cacheService.refreshWithPipeline(futureKey, topicKey, tasks);System.out.println("成功的将" + futureKey + "下的当前需要执行的任务数据刷新到" + topicKey + "下");}}}}

普通redis客户端和服务器交互模式

Pipeline请求模型

官方测试结果数据对比

延迟发布任务的消费

上面已经解决了文章预发布任务的处理,下面就是从缓存中定时的拉取任务进行文章发布了

在自媒体段使用Feign接口远程调用任务模块的poll方法拉取缓存中的任务

    @Scheduled(fixedRate = 1000)@SneakyThrows@Overridepublic void scanNewsByTask() {log.info("文章审核---消费任务执行---begin---");//从缓存中拉取文章发布任务ResponseResult responseResult = scheduleClient.poll(TaskTypeEnum.NEWS_SCAN_TIME.getTaskType(),TaskTypeEnum.NEWS_SCAN_TIME.getPriority());if(responseResult.getCode().equals(200) && responseResult.getData() != null){String json_str = JSON.toJSONString(responseResult.getData());Task task = JSON.parseObject(json_str, Task.class);byte[] parameters = task.getParameters();WmNews wmNews = ProtostuffUtil.deserialize(parameters, WmNews.class);//审核文章内容wmNewsAutoScanService.autoScanWmNews(wmNews.getId());}log.info("文章审核---消费任务执行---end---");}

 任务模块的poll

    public Task poll(int type,int priority) {Task task = null;try {String key = type+"_"+priority;String task_json = cacheService.lRightPop(ScheduleConstants.TOPIC + key);if(StringUtils.isNotBlank(task_json)){task = JSON.parseObject(task_json, Task.class);//更新数据库信息updateDb(task.getTaskId(),ScheduleConstants.EXECUTED);}}catch (Exception e){e.printStackTrace();log.error("poll task exception");}return task;}

http://www.dtcms.com/wzjs/409949.html

相关文章:

  • 龙岗企业网站建设国内搜索引擎有哪些
  • 阿里云虚拟主机建网站google谷歌搜索引擎
  • wordpress建站镜像seo挖关键词
  • 合同下载 公司网站公司网站建设费用多少
  • 南阳教育论坛网站建设宣传推广文案
  • 河北省建设工程信息网站神马搜索推广
  • 网站建设与管理的网页百度注册公司网站
  • 网站建设对企业的重要性站长之家源码
  • 昆明网站建设价目表2023年新冠疫情最新消息
  • 网站维护常识免费域名解析
  • 网络营销推广方法和工具宁波seo网络推广公司排名
  • 美容网站制作沈阳今天刚刚发生的新闻
  • 生活馆网站开发背景移动网站推广如何优化
  • 设计师接单的网站建站平台哪家好
  • 做产品推广什么网站会比较好seo基本步骤
  • 单人给一个公司做网站费用上海网站seo公司
  • 网站策划书的内容百度指数app下载
  • 专业的郑州网站推广推广普通话的内容
  • 建网站的成本计算网络营销专业怎么样
  • 厦门网站建设哪家便宜seo软件简单易排名稳定
  • 宁波专业品牌网站制作外包百度登陆页面
  • 外贸建站代理备案域名交易平台
  • 用易语言做钓鱼网站品牌网络推广怎么做
  • wordpress新评论提醒搜索引擎优化是什么工作
  • 哪个网站做黑色星期五订酒店活动国内前10电商代运营公司
  • asp 网站图标武汉seo计费管理
  • 教育培训网站模板优秀软文范例800字
  • 如何使用模板做网站自助建站的优势
  • 分销怎么做网站开发分销无锡网站服务公司
  • 交流网站模版做一个公司网页多少钱