Ron基于Redis滑动过期机制的定时任务实现
Ron是一款基于Redis的分布式定时任务调度系统。它提供了可靠的定时任务调度服务,允许多个任务同时执行,支持延迟执行和循环执行等功能。Ron的设计目标是高可用、高效率、易用性,同时具备分布式扩展能力。
Redis滑动过期机制是Ron实现高效率的关键技术。在Redis中,key的过期时间通常是静态的,即指定一个过期时间,当时间到达时,key会被自动删除。而滑动过期机制允许在key被访问时动态地更新过期时间,从而避免了过期时间被固定的缺点。
基于Redis滑动过期机制的实现,Ron在定时任务调度中引入了超时时间概念。当一个任务被添加到Ron中时,它会被设置一个超时时间T1,该任务会在T1时间内执行完毕,否则会被认为执行超时。此时,另一个定时任务会被启动,执行当前任务未完成的任务。这样可以保证任务的完整性和及时性。
Ron的代码结构如下:
├── README.md
│ ├── config.go
│ └── config.json
├── handler
│ ├── client.go
│ ├── job_handler.go
│ └── server.go
│ ├── job.go
│ └── job_manager.go
├── logger.go
└── redis.go
在mn.go中,Ron采用了Go语言的goroutine和chan,并结合了Redis实现了高效的定时任务调度系统,示例代码如下:```gopackage mnimport ("flag""github.com/liangdas/mqant""github.com/liangdas/mqant/conf""github.com/tidwall/gjson""runtime""strconv""time")func mn() {// 1. 读取配置文件var configFile = flag.String("configFile", "config/config.json", "config file path")flag.Parse()config, err := conf.LoadConfig(*configFile)if err != nil {panic(err)}// 2. 启动rpc服务srv := mqant.CreateServer(config)srv.RegisterGO("Ron", Ron)// 3. 启动goroutine,定时执行任务go func() {for {// 3.1 从Redis中获取下一次执行的任务IDnextID, err := util.GetRedis().Brpop("JobQueue", 1*time.Second).Result()if err != nil {continue}// 3.2 获取任务详情,判断是否超时jobID := gjson.Get(nextID, "JobID").String()job := job_manager.GetJobByID(jobID)if job == nil {continue}timeout, err := strconv.Atoi(gjson.Get(nextID, "Timeout").String())if err != nil {timeout = job.GetTimeout()}if time.Now().Unix() > job.GetStartTime()+int64(timeout) {job.SetStatus(job_fled)job_manager.UpdateJob(job)continue}// 3.3 执行任务go func() {job.SetStatus(job_running)job.Run()job_manager.UpdateJob(job)}()}}()// 4. 启动服务器srv.Run()}func Ron(args []byte) string {return "Ron is running..."}
在handler/server.go中,Ron定义了RPC接口,其中AddJob接口用于添加任务。
type Server struct{}
func (s *Server) AddJob(args []byte) string {
// 1. 解析参数
jobName := gjson.Get(args, “Name”).String()
jobDelay := gjson.Get(args, “Delay”).Int()
jobTimeout := gjson.Get(args, “Timeout”).Int()
// 2. 创建任务实例

job := job.NewJob(jobName, jobDelay, jobTimeout)
// 3. 添加到任务队列
jobID := job_manager.AddJob(job)
// 4. 添加到Redis队列
util.GetRedis().Lpush(“JobQueue”, fmt.Sprintf(`{“JobID”:%q,”Timeout”:%q}`, jobID, jobTimeout))
// 5. 返回任务ID
return jobID
通过Ron基于Redis滑动过期机制的定时任务实现,可以实现高效、可靠的定时任务调度服务。该方案具有易于扩展、高效、简单易用等优点,在实际项目中得到了广泛应用。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
微软官方解释的WP8后台任务机制有哪些?
微软说,在WP8中后台程序有两种,一种是“PeriodicTask”(周期任务)——占用资源、数据较少需定时运行的任务,一种是“ResourceIntensiveTask”(资源集中任务)——占用资源、数据量都比较大 的。 开发者要在开发app时要选定自己的app类型,或者是一个不带后台的app。 对于这两种任务的运行,微软有着严格的运行机制:1,一些共同的机制,例如:1),一些API对于这两种后台程序都是不可用的2),无论哪种后台,在运行时非视频任务占用内存不得超多11MB,视频类任务不得超过15MB,一旦超过将被立即终止3),对于超过两周没有主动运行的程序将自动组织其对应后台当然在这条下面还有很多细分情况,有兴趣的可以自己看接下来是一些分别的限制,例如,对于“PeriodicTask”(周期任务):1,每半小时运行最多25S2,节电模式下停止运行3,对运行数量有所限制。 如果程序没有出现在后台任务列表中,则最多只能运行6个此种后台任务对于“ResourceIntensiveTask”(资源集中任务)的限定则更加严格,包括:1,只能在电量大于90%时开启后台运行;2,只能在充电或有外接电源时开启后台运行;3,只能在锁屏时运行;4,只能在连接了电脑或wifi时运行,不占用流量5,只能在没有通话时运行;6,一般可连续运行十分钟所以这样看来,WP的后台绝不是什么安卓的“真后台”,而且对资源的管理非常严格以保证系统的流畅和续航。 当然还写了其他很多东西,限于英文及技术水平我就弄不清楚了,不过对于一般用户知道这些信息也足够了。 欢迎大神把一些更细节的东西翻译出来。
java Web怎样用redis做角色权限菜单控制
redis只是一个缓存而已,具体实现还是得靠数据库+拦截器等,数据库中定义角色、权限、用户等表,拦截请求后判断用户角色是否拥有权限。 权限的范畴比较广,可以是请求路径,可以是用户角色等。 你可以把一些权限信息预加载到redis!
REDIS学习查看redis状态,以及rdb和aof两种持久化方案的区别
命令:redis-cli info //查看redis服务器状态的rdb : redis database 默认开启的,是将数据从内存备份到硬盘中。 aof:append only f 需要自己根据需要开启,是将执行命令存储在一个文件中。 建议看一下apeit-程序猿IT的文章《redis数据持久化》,讲的简单明了。
发表评论