亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 基于redis實現(xiàn)定時任務(wù)的方法詳解

基于redis實現(xiàn)定時任務(wù)的方法詳解

熱門標簽:四川穩(wěn)定外呼系統(tǒng)軟件 b2b外呼系統(tǒng) 一個地圖標注多少錢 400電話辦理的口碑 南京手機外呼系統(tǒng)廠家 廊坊外呼系統(tǒng)在哪買 地圖標注工廠入駐 高碑店市地圖標注app 臺灣電銷

前言

業(yè)務(wù)中碰到的需求(抽象描述一下):針對不同的用戶能夠?qū)崿F(xiàn)不同時間的間隔循環(huán)任務(wù)。比如在用戶注冊成功24小時后給用戶推送相關(guān)短信等類似需求。

使用crontab?太重,且基本不現(xiàn)實,不可能給每一個用戶在服務(wù)器上生成一個定時任務(wù)。
定時輪詢?IO頻繁且效率太低

想到經(jīng)常的使用的redis可以設(shè)置緩存時間,應(yīng)該會有過期的事件通知吧,查了一下文檔,果然有相關(guān)配置,叫做“鍵空間事件通知”。具體說明可參考官方文檔。

技術(shù)棧

redis / nodeJs / koa

技術(shù)重難點

  • 開啟redis的鍵空間通知功能(2.8.0及以上的版本才有此功能)
  • 盡量使用單獨的redis db來實現(xiàn)
  • 使用基于redis的分布式鎖來實現(xiàn)相關(guān)事件不會被重復(fù)消費
  • 需要二次使用的信息需要體現(xiàn)在redis緩存的key中
  • redis cache key使用業(yè)務(wù)前綴,避免重名覆蓋
  • 防止業(yè)務(wù)服務(wù)重啟導(dǎo)致nodejs層面的監(jiān)聽失效

"talk is cheap, show me the code 🤖"

核心代碼

核心代碼
const { saveClient, subClient } = require('./db/redis') // 存儲實例和訂閱實例需要為兩個不同的實例
const processor = require('./service/task')
const config = require('./config/index')
const innerDistributedLockKey = '__' // 內(nèi)部使用的分布式鎖的key的特征值
const innerDistributedLockKeyReg = new RegExp(`^${innerDistributedLockKey}`)

saveClient.on('ready', async () => {
 saveClient.config('SET', 'notify-keyspace-events', 'Ex') // 存儲實例設(shè)置為推送鍵過期事件
 console.log('redis init success')
})

subClient.on('ready', () => { // 服務(wù)重啟后依舊可以初始化所有processor
 subClient.subscribe(`__keyevent@${config.redis.sub.db}__:expired`) // 訂閱實例負責(zé)訂閱消息
 subClient.on('message', async (cahnnel, expiredKey) => {
  // 分布式鎖的key不做監(jiān)聽處理
  if (expiredKey.match(innerDistributedLockKeyReg)) return
  // 簡易分布式鎖,拿到鎖的實例消費event
  const cackeKey = `${innerDistributedLockKey}-${expiredKey}`
  const lock = await saveClient.set(cackeKey, 2, 'ex', 5, 'nx') // 這里的用法可以實現(xiàn)簡易的分布式鎖
  if (lock === 'OK') {
   await saveClient.del(cackeKey)
   for (let key in processor) {
    processor[key](expiredKey) // processor對應(yīng)的是接收到相關(guān)鍵過期通知后執(zhí)行的業(yè)務(wù)邏輯,比如推送短信,然后在相關(guān)processor中再次set一個定時過期的key
   }
  }
 })
 console.log('subClient init success')
})
servide/task (processor)
exports.sendMessage = async function sendMessage(expiredKey, subClient) {
 // 只處理相關(guān)業(yè)務(wù)的過期事件
 if (expiredKey.match(/^send_message/)) {
  const [prefix, userId, type] = expiredKey.split('-')
  let user = getUser(userId)
  if (user.phone) {
   push(message) // 偽代碼
   resetRedisKey(expiredKey, ttl) // 重新把key設(shè)置為一段時間后過期,過期后會再次觸發(fā)本邏輯
  }
 }
}

總結(jié)

  • 此功能利用了redis的鍵空間通知功能實現(xiàn)了簡單了基于用戶或者基于不同業(yè)務(wù)場景的定時任務(wù)功能。由于鍵空間事件通知功能是一個較消耗CPU的操作,所以建議使用單獨的DB來處理。
  • 這里展示出來的是基本用法,未考慮定時任務(wù)的持久化功能,如果使用過程中redis故障重啟,則會導(dǎo)致所有定時任務(wù)丟失。如果在redis發(fā)布鍵失效通知時,訂閱服務(wù)出故障未在線,或者網(wǎng)絡(luò)問題沒有被消費方收到,也會導(dǎo)致此次事件丟失。
  • redis的expired事件并不是在key過期的時候觸發(fā),而是在key被刪除的時候觸發(fā)。redis會定期清理過期的key,或者當(dāng)訪問key的時候檢查是否過期,只有這時過期的key才會觸發(fā)刪除操作,因此會有一些小的時間差距(個人的實際使用中并沒有影響用戶體驗)。

因此需要權(quán)衡使用redis的過期機制實現(xiàn)的定時任務(wù)的使用場景。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • java操作Redis緩存設(shè)置過期時間的方法
  • 使用redis的increment()方法實現(xiàn)計數(shù)器功能案例
  • Redis有效時間設(shè)置以及時間過期處理操作

標簽:甘南 河源 拉薩 南寧 畢節(jié) 定州 伊春 泰州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《基于redis實現(xiàn)定時任務(wù)的方法詳解》,本文關(guān)鍵詞  基于,redis,實現(xiàn),定時,任務(wù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于redis實現(xiàn)定時任務(wù)的方法詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于redis實現(xiàn)定時任務(wù)的方法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    午夜精品国产自在现线拍| 亚飞与亚基在线观看| 欧美另类videosbestsex高清| 日本特黄特黄aaaaa大片| 国产亚洲免费观看| 毛片的网站| 精品国产一区二区三区国产馆| 日韩女人做爰大片| 亚欧视频在线| 成人免费观看男女羞羞视频| 国产高清在线精品一区a| 成人在激情在线视频| 香蕉视频亚洲一级| 国产一区二区精品久| 国产视频一区二区在线观看| 成人免费观看网欧美片| 国产网站免费观看| 国产a视频| 成人免费高清视频| 97视频免费在线| 青草国产在线观看| 久草免费在线观看| 国产成人精品综合| 亚洲天堂一区二区三区四区| 天天色成人| 青青久久精品国产免费看| 国产成人精品在线| 日本免费看视频| 日韩免费在线视频| 黄视频网站在线看| 天天色色网| 在线观看成人网| 日本伦理黄色大片在线观看网站| 久久99中文字幕久久| 91麻豆精品国产综合久久久| 国产国产人免费视频成69堂| 欧美爱爱动态| 国产一区二区精品久久91| 久久99爰这里有精品国产| 精品国产亚洲人成在线| 亚洲精品影院一区二区| 台湾美女古装一级毛片| 九九热国产视频| 久久99中文字幕| 日韩av成人| 亚洲女初尝黑人巨高清在线观看| 日韩女人做爰大片| 毛片高清| 一级片免费在线观看视频| 精品视频一区二区| 精品久久久久久中文字幕2017| 日韩一级黄色| 午夜家庭影院| 国产91素人搭讪系列天堂| 成人在免费观看视频国产| 精品视频免费观看| 一级毛片视频在线观看| 久久99爰这里有精品国产| 国产麻豆精品免费视频| 中文字幕一区二区三区精彩视频| 韩国毛片 免费| 韩国三级香港三级日本三级la| 久久国产影院| 国产一区二区福利久久| 久久精品免视看国产明星| 免费一级生活片| 91麻豆精品国产自产在线观看一区 | 99久久精品国产国产毛片 | 你懂的在线观看视频| 成人免费观看网欧美片| 黄色免费三级| 色综合久久手机在线| 日韩男人天堂| 久久国产精品自由自在| 日本免费区| 韩国三级香港三级日本三级| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美一级视频免费观看| 香蕉视频三级| 国产不卡在线观看视频| 国产网站免费视频| 欧美激情一区二区三区视频 | 久久精品免视看国产明星| a级毛片免费观看网站| 日韩在线观看免费| 国产高清视频免费观看| 日韩av成人| 欧美一级视频免费| 精品视频一区二区| 97视频免费在线观看| 欧美国产日韩精品| 午夜精品国产自在现线拍| 久草免费资源| 久久99中文字幕久久| 韩国毛片 免费| 欧美激情一区二区三区在线播放| 91麻豆爱豆果冻天美星空| 日韩专区一区| 国产91精品系列在线观看| 色综合久久天天综合观看| 欧美国产日韩在线| 午夜在线影院| 欧美另类videosbestsex高清| 国产一区二区福利久久| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 黄视频网站在线看| 在线观看成人网| 欧美a级成人淫片免费看| 九九久久国产精品大片| 青青久热| 亚洲精品影院久久久久久| 亚洲第一页乱| 国产麻豆精品免费视频| 91麻豆精品国产综合久久久| 国产成人啪精品| 日韩男人天堂| 国产一级生活片| 国产一区二区精品久| 日韩免费在线| 国产麻豆精品免费视频| 国产原创视频在线| 国产视频一区二区在线观看| 日韩av成人| 人人干人人草| 精品视频免费看| 国产激情一区二区三区| 九九久久99| 午夜久久网| 国产一区免费观看| 欧美激情一区二区三区视频| 可以免费看毛片的网站| 国产一区二区精品久| 日本特黄特黄aaaaa大片| 日韩中文字幕在线播放| 久草免费资源| 97视频免费在线观看| 精品久久久久久中文字幕一区| 国产精品1024永久免费视频| 国产成人精品综合在线| 午夜欧美成人香蕉剧场| 免费国产在线观看不卡| 免费一级生活片| 美女免费精品高清毛片在线视| 国产国语对白一级毛片| 欧美日本韩国| 九九精品久久久久久久久| 国产视频网站在线观看| 亚洲精品久久久中文字| 黄视频网站在线看| 欧美激情伊人| 欧美另类videosbestsex| 亚洲天堂一区二区三区四区| 精品视频在线观看一区二区| 999精品影视在线观看| 九九精品久久久久久久久| 欧美日本免费| 韩国三级视频在线观看| 日本免费乱人伦在线观看 | 成人免费一级毛片在线播放视频| 一级女性大黄生活片免费| 台湾美女古装一级毛片| 你懂的日韩| 韩国毛片免费大片| 国产伦理精品| 日韩avdvd| 成人a大片在线观看| 九九久久国产精品大片| 一级毛片视频播放| 99久久精品国产免费| 久久福利影视| 国产a网| 国产精品1024永久免费视频| 精品视频在线观看视频免费视频 | 成人高清视频在线观看| 99久久精品国产麻豆| 精品国产一区二区三区免费| 天天色成人| 国产不卡在线看| 亚欧成人毛片一区二区三区四区| 可以免费看毛片的网站| 九九精品在线播放| 国产伦精品一区三区视频| 精品视频免费看| 免费国产在线视频| 91麻豆tv| 国产一区二区精品尤物| 国产91素人搭讪系列天堂| 黄色免费三级| 国产精品1024永久免费视频 | 国产激情视频在线观看| 999久久66久6只有精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩中文字幕一区二区不卡| 天天色成人网| 韩国三级视频网站| 九九精品在线播放| 91麻豆精品国产高清在线| 国产国语对白一级毛片| 国产美女在线观看| 精品视频在线看|