--用redis实现任务调度--

一.因业务需求,最近写了个手机端的直播地址分配,由于服务器带宽有限,所以要控制最大在线直播人数,为了解决这个问题用了redis实现直播地址分配,直播有另外直播服务器处理, 该服务器只分配直播地址
1.点击直播,先进入直播任务队列中,返回一个定时器
public TimedTask toLiveTask(LiveInfo liveInfo) {Jedis jedis = JedisUtils.getResource();jedis.lpush(Constants.WAIT_LIVE_TASK_QUEUE, GsonUtils.toJson(liveInfo));Timer timer = new Timer(true);boolean flag = true;TimedTask timedTask = new TimedTask(flag,liveInfo);timer.schedule(timedTask, Global.WAIT_TIME);jedis.close();return timedTask;}
2.直播进行中,如果当前在线直播人数小于最大直播数则分配直播地址,否则等待中,
@Transactional(readOnly = false)public String liveOnTask(LiveInfo liveInfo,TimedTask timedTask) {Jedis jedis = JedisUtils.getResource();boolean flag = true;Timer t = new Timer(true);timedTask = new TimedTask(flag,liveInfo);t.schedule(timedTask, Global.WAIT_TIME);//定时器开始while(flag && timedTask.flag) {//任务还在synchronized (this) {//并发处理//判断当前直播总数是否小于最大直播总数,如果小于则分配直播地址,大于则继续等待    if(Integer.valueOf(jedis.get(Constants.ON_LIVE_MAX_SUM))<Global.MAX_ON_LIVE_SUM) {//判断当前直播总数liveInfo.setBeginTime(new Date());//直播开始时间liveInfo.setLiveUrl(IdGen.uuid());//分发直播地址Transaction tx = jedis.multi();//redis事务liveInfoDao.insert(liveInfo);tx.sadd(Constants.ON_LIVE_TASK_QUEUE, GsonUtils.toJson(liveInfo));//加入直播任务queuetx.incr(Constants.ON_LIVE_MAX_SUM);//直播人数增加tx.exec();jedis.close();//System.out.println("返回直播地址:"+liveInfo.getLiveUrl());flag = false;timedTask.cancel();//直播地址分配成功,定时任务取消return liveInfo.getLiveUrl();}else {flag = timedTask.flag;//继续等待标识//System.out.println("等待中,继续监控任务");}}}jedis.close();return null;}
3.退出直播 等待超时退出直播,和直播结束
@Transactional(readOnly = false)public void liveOffTask(LiveInfo liveInfo){Jedis jedis = JedisUtils.getResource();if (liveInfo == null) return;if(liveInfo.getLiveUrl().equals("") || liveInfo.getLiveUrl()==null){jedis.lrem(Constants.WAIT_LIVE_TASK_QUEUE, 1, GsonUtils.toJson(liveInfo));//取消任务jedis.close();return ;}Transaction tx = jedis.multi();liveInfo.setEndTime(new Date());liveInfoDao.updateByPrimaryKey(liveInfo);//同步到数据库tx.decr(Constants.ON_LIVE_MAX_SUM);//直播总数递减     tx.srem(Constants.ON_LIVE_TASK_QUEUE, GsonUtils.toJson(liveInfo));//清除直播任务tx.exec();jedis.close();}
4.定时器
public class TimedTask extends TimerTask{public boolean flag;private LiveInfo liveInfo;public TimedTask(boolean flag,LiveInfo liveInfo) {this.flag = flag;this.liveInfo = liveInfo;}@Overridepublic void run() {Jedis jedis = JedisUtils.getResource();jedis.lrem(Constants.WAIT_LIVE_TASK_QUEUE, 1, GsonUtils.toJson(liveInfo));//等待任务队列jedis.close();flag = false;//取消等待标记//System.out.println("等待超时了,任务结束"+ "flag="+flag);}}
5.controller层 直播
@ResponseBody
@RequestMapping(value = "/getLiveUrl", method = RequestMethod.POST)
public String getLiveAddr(@RequestParam(value = "userId", required = false) String userId,@RequestParam(value = "title", required = false) String title,@RequestParam(value = "summary", required = false) String summary,@RequestParam(value = "location", required = false) String location){LiveInfo liveInfo = new LiveInfo();liveInfo.setUserId(userId);liveInfo.setTitle(title);liveInfo.setSummary(summary);liveInfo.setLocation(location);liveInfo.setBeginTime(new Date());liveInfo.setLiveUrl(IdGen.uuid());return liveTaskService.liveOnTask(liveInfo, liveTaskService.toLiveTask(liveInfo));}
6. 退出直播
@ResponseBody@RequestMapping(value = "/liveOut", method = RequestMethod.GET)public void liveOut(@RequestParam(value = "liveUrl", required = false) String liveUrl) {LiveInfo liveInfo = liveInfoService.getLiveInfoByLiveUrl(liveUrl);if(liveInfo==null) {throw new PhoneException(HttpStatus.BAD_REQUEST, new Error(400, "直播地址错误!"));}liveTaskService.liveOffTask(liveInfo);}
7.初始化最大直播总数省略(项目启动初始化redis的最大直播总数)

用redis实现任务调度相关推荐

  1. 基于Redis的任务调度

    基于redis的动态任务调度平台,支持动态groovy任务和静态任务(任务要继承IJob接口) 任务调度平台: 这里假设任务失败有两种类型: 一.worker节点与master节点失去联系,认为任务失 ...

  2. 宜信开源|数据库审核软件Themis的规则解析与部署攻略

    一.介绍 Themis是宜信公司DBA团队开发的一款数据库审核产品,可帮助DBA.开发人员快速发现数据库质量问题,提升工作效率.其名称源自希腊神话中的正义与法律女神.项目取此名称,寓意此平台对数据库质 ...

  3. scrapy-redis 分布式学习记录

    学习了scrapy 爬虫框架 觉得这个框架做数据抓取很好用,但是不支持分布式.网上查了有大牛在它基础上进行改进出了一个scrapy-redis 的框架 在网上找了很多教程,但是都没有说到基于scrap ...

  4. 爬虫那些事-网页爬虫设计思路

    一.前言 爬虫广泛使用于搜索引擎.新闻聚合以及大数据采集当中,一个良好的爬虫系统需要考虑很多方面:爬虫种子的获取需要有个稳定的任务调度机制,下载页面过程需要考虑到网页内容的生成是否是需要js渲染,请求 ...

  5. 新浪微博分布式爬虫分享

    代码请移步GitHub:SinaSpider (上面有跳转链接,别再问我代码在哪里了) 爬虫功能: 此项目实现将单机的新浪微博爬虫(见<新浪微博爬虫分享(一天可抓取 1300 万条数据)> ...

  6. python微博爬虫教程_Python爬虫教程-新浪微博分布式爬虫分享

    爬虫功能: 此项目实现将单机的新浪微博爬虫重构成分布式爬虫. Master机只管任务调度,不管爬数据:Slaver机只管将Request抛给Master机,需要Request的时候再从Master机拿 ...

  7. python分布式任务调度_Python使用Celery分布式异步队列/任务调度(基于Redis) - pytorch中文网...

    今天使用爬虫有些耗时较长,需要使用任务调度,Celery是Python开发的分布式任务调度模块,Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前,Celery支持的消息服务有Rabb ...

  8. Redis分布式锁 Spring Schedule实现任务调度

    一看到标题就知道,这一篇博客又是总结分布式工作环境中集群产生的问题,个人觉得分布式没有那么难以理解,可能也是自己见识比较浅,对我来说,分布式只是一种后端业务演进时的一种工作方式,而真正实现这种工作方式 ...

  9. java 分布式任务_一个简单的基于 Redis 的分布式任务调度器 —— Java 语言实现...

    折腾了一周的 Java Quartz 集群任务调度,很遗憾没能搞定,网上的相关文章也少得可怜,在多节点(多进程)环境下 Quartz 似乎无法动态增减任务,恼火.无奈之下自己撸了一个简单的任务调度器, ...

最新文章

  1. 点击area不出现黑框_6种黑框玻璃门隔断,凭高颜值和实用性成为小户型新宠!...
  2. 关于浏览器跨域请求的相关原理实现--很经典的博客
  3. 《Java 高并发》04 线程的基本操作
  4. dncnn图像去噪_一种基于DnCNNs改进的图像降噪方法与流程
  5. 爬虫入门三(获取各国网址,三种网页抓取方法,下载缓存)
  6. 二级c语言上机程序填空,浙江省计算机二级c语言上机考试真题(二)程序填空
  7. 基金大跌,基民上闲鱼“卖货回血”了!支付宝深夜发文!真的没人买基了?...
  8. 零基础学python-看完这篇,零基础也知道怎么学Python
  9. 如何实现音频合成立体声录制?
  10. ue4缓存位置怎么改_[UE4]动态液体材质浅谈
  11. Macbook/Mac OS中阅读代码软件推荐
  12. 【百度网盘】老罗android开发视频教程[压缩后3.63G]
  13. windows下 gcc 下载及使用指南
  14. 摩尔定律已经走到尽头?
  15. 未连接到互联网的解决方法(chrome)
  16. 推荐(笔记软件、日程安排软件)
  17. 第6章 TCP/IP路由协议故障处理
  18. 互联网大佬谁编程第一,周鸿祎算第三
  19. UE4 蓝图学习 FlipFlop
  20. Word连续引用[1, 2] [3-5]

热门文章

  1. OKEX及OKCoin量化交易入门-API入门及实践(Python语言)
  2. android 优秀框架整理,2021年我们程序员该如何进阶和规划
  3. 神经网络模型matlab例子,神经网络及其matlab实现
  4. 集中监控计算机主要功能
  5. 苏轼与江西交通的不解之缘
  6. 一步一个脚印的走法-走了N年
  7. 【Camera专题】Sprd-Camera帧率fps的计算及拍照闪红问题的解决
  8. 苹果Mac OS X系统安全评级(2)
  9. 1.3万星*~~~ Github 程序员转行考公务员指南
  10. python基础练习(3)