新聞中心
Ron基于Redis滑動(dòng)過期機(jī)制的定時(shí)任務(wù)實(shí)現(xiàn)

長(zhǎng)安網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
Ron是一款基于Redis的分布式定時(shí)任務(wù)調(diào)度系統(tǒng)。它提供了可靠的定時(shí)任務(wù)調(diào)度服務(wù),允許多個(gè)任務(wù)同時(shí)執(zhí)行,支持延遲執(zhí)行和循環(huán)執(zhí)行等功能。Ron的設(shè)計(jì)目標(biāo)是高可用、高效率、易用性,同時(shí)具備分布式擴(kuò)展能力。
Redis滑動(dòng)過期機(jī)制是Ron實(shí)現(xiàn)高效率的關(guān)鍵技術(shù)。在Redis中,key的過期時(shí)間通常是靜態(tài)的,即指定一個(gè)過期時(shí)間,當(dāng)時(shí)間到達(dá)時(shí),key會(huì)被自動(dòng)刪除。而滑動(dòng)過期機(jī)制允許在key被訪問時(shí)動(dòng)態(tài)地更新過期時(shí)間,從而避免了過期時(shí)間被固定的缺點(diǎn)。
基于Redis滑動(dòng)過期機(jī)制的實(shí)現(xiàn),Ron在定時(shí)任務(wù)調(diào)度中引入了超時(shí)時(shí)間概念。當(dāng)一個(gè)任務(wù)被添加到Ron中時(shí),它會(huì)被設(shè)置一個(gè)超時(shí)時(shí)間T1,該任務(wù)會(huì)在T1時(shí)間內(nèi)執(zhí)行完畢,否則會(huì)被認(rèn)為執(zhí)行超時(shí)。此時(shí),另一個(gè)定時(shí)任務(wù)會(huì)被啟動(dòng),執(zhí)行當(dāng)前任務(wù)未完成的任務(wù)。這樣可以保證任務(wù)的完整性和及時(shí)性。
Ron的代碼結(jié)構(gòu)如下:
“`text
.
├── README.md
├── app
│ └── mn.go
├── config
│ ├── config.go
│ └── config.json
├── handler
│ ├── client.go
│ ├── job_handler.go
│ └── server.go
├── job
│ ├── job.go
│ └── job_manager.go
└── util
├── logger.go
└── redis.go
在mn.go中,Ron采用了Go語言的goroutine和chan,并結(jié)合了Redis實(shí)現(xiàn)了高效的定時(shí)任務(wù)調(diào)度系統(tǒng),示例代碼如下:
```go
package mn
import (
"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. 啟動(dòng)rpc服務(wù)
srv := mqant.CreateServer(config)
srv.RegisterGO("Ron", Ron)
// 3. 啟動(dòng)goroutine,定時(shí)執(zhí)行任務(wù)
go func() {
for {
// 3.1 從Redis中獲取下一次執(zhí)行的任務(wù)ID
nextID, err := util.GetRedis().Brpop("JobQueue", 1*time.Second).Result()
if err != nil {
continue
}
// 3.2 獲取任務(wù)詳情,判斷是否超時(shí)
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 執(zhí)行任務(wù)
go func() {
job.SetStatus(job_running)
job.Run()
job_manager.UpdateJob(job)
}()
}
}()
// 4. 啟動(dòng)服務(wù)器
srv.Run()
}
func Ron(args []byte) string {
return "Ron is running..."
}
在handler/server.go中,Ron定義了RPC接口,其中AddJob接口用于添加任務(wù)。
“`go
type Server struct{}
func (s *Server) AddJob(args []byte) string {
// 1. 解析參數(shù)
jobName := gjson.Get(args, “Name”).String()
jobDelay := gjson.Get(args, “Delay”).Int()
jobTimeout := gjson.Get(args, “Timeout”).Int()
// 2. 創(chuàng)建任務(wù)實(shí)例
job := job.NewJob(jobName, jobDelay, jobTimeout)
// 3. 添加到任務(wù)隊(duì)列
jobID := job_manager.AddJob(job)
// 4. 添加到Redis隊(duì)列
util.GetRedis().Lpush(“JobQueue”, fmt.Sprintf(`{“JobID”:%q,”Timeout”:%q}`, jobID, jobTimeout))
// 5. 返回任務(wù)ID
return jobID
}
通過Ron基于Redis滑動(dòng)過期機(jī)制的定時(shí)任務(wù)實(shí)現(xiàn),可以實(shí)現(xiàn)高效、可靠的定時(shí)任務(wù)調(diào)度服務(wù)。該方案具有易于擴(kuò)展、高效、簡(jiǎn)單易用等優(yōu)點(diǎn),在實(shí)際項(xiàng)目中得到了廣泛應(yīng)用。
創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢:028-86922220。
當(dāng)前名稱:ron基于Redis滑動(dòng)過期機(jī)制的定時(shí)任務(wù)實(shí)現(xiàn)(redis滑動(dòng)過期c)
網(wǎng)站地址:http://m.fisionsoft.com.cn/article/dpipsdh.html


咨詢
建站咨詢
