校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 基于redis實現定時任務的方法詳解

基于redis實現定時任務的方法詳解

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

前言

業務中碰到的需求(抽象描述一下):針對不同的用戶能夠實現不同時間的間隔循環任務。比如在用戶注冊成功24小時后給用戶推送相關短信等類似需求。

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

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

技術棧

redis / nodeJs / koa

技術重難點

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

"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 = '__' // 內部使用的分布式鎖的key的特征值
const innerDistributedLockKeyReg = new RegExp(`^${innerDistributedLockKey}`)

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

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

總結

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

因此需要權衡使用redis的過期機制實現的定時任務的使用場景。

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

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

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

巨人網絡通訊聲明:本文標題《基于redis實現定時任務的方法詳解》,本文關鍵詞  基于,redis,實現,定時,任務,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于redis實現定時任務的方法詳解》相關的同類信息!
  • 本頁收集關于基于redis實現定時任務的方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91年精品国产| 国产精品一区二区免费不卡| 亚洲第一av色| 91浏览器打开| 婷婷夜色潮精品综合在线| 欧美丰满少妇xxxxx高潮对白| 亚洲高清一区二区三区| 欧美精品久久一区| 国产伦理精品不卡| 亚洲视频一区在线观看| 欧美精选午夜久久久乱码6080| 免费高清成人在线| 国产精品乱人伦| 欧美色综合网站| 久久国产精品免费| 综合色天天鬼久久鬼色| 日韩久久久久久| 99久久99久久综合| 美美哒免费高清在线观看视频一区二区 | 在线亚洲+欧美+日本专区| 天天综合天天做天天综合| 久久色在线观看| 欧美三级日本三级少妇99| 国产精品一区免费视频| 午夜视频在线观看一区二区 | 亚洲欧美精品午睡沙发| 精品少妇一区二区三区在线播放 | 亚洲午夜视频在线观看| 国产欧美日韩激情| 欧美一区二区三区在线电影| 91福利资源站| 成人美女在线观看| 国产自产高清不卡| 免播放器亚洲一区| 亚洲成av人片观看| 亚洲精品老司机| 国产精品初高中害羞小美女文| 精品日韩一区二区三区| 4hu四虎永久在线影院成人| 在线观看欧美精品| 91麻豆国产精品久久| 国产精品一区二区在线看| 麻豆精品在线播放| 日韩av电影免费观看高清完整版 | 一区二区三区色| 亚洲欧美日韩在线| 亚洲色图一区二区三区| 亚洲欧美中日韩| 中文字幕一区二区三区视频| 欧美极品aⅴ影院| 久久亚洲精品小早川怜子| 日韩视频在线你懂得| 91精品国产福利| 日韩一级免费观看| 亚洲精品一区二区三区四区高清| 在线成人小视频| 欧美一级夜夜爽| 精品国一区二区三区| 久久综合999| 国产精品每日更新在线播放网址 | 美女视频免费一区| 国产永久精品大片wwwapp| 国产剧情av麻豆香蕉精品| 国产aⅴ综合色| 91麻豆免费观看| 欧美年轻男男videosbes| 91精品国产综合久久蜜臀| 日韩一区二区在线看| 亚洲精品一区二区三区精华液 | 久久99精品一区二区三区三区| 久久成人18免费观看| 国产精品一区在线观看乱码 | av电影在线观看不卡| 91电影在线观看| 欧美一级二级在线观看| 久久久91精品国产一区二区精品 | 一区在线播放视频| 日韩精品成人一区二区三区| 国产自产2019最新不卡| 一本大道av伊人久久综合| 欧美美女一区二区| 欧美激情资源网| 亚洲第一久久影院| 国产精品综合二区| 在线精品视频免费播放| 欧美成人伊人久久综合网| 国产精品伦一区| 麻豆成人av在线| 一本色道综合亚洲| 久久精品亚洲精品国产欧美kt∨| 亚洲女同一区二区| 国产精品影音先锋| 欧美日韩国产首页| 国产精品污www在线观看| 日韩高清欧美激情| 一本到一区二区三区| 久久久国产精品麻豆| 婷婷丁香激情综合| 91丨九色丨蝌蚪丨老版| 精品国产3级a| 日日摸夜夜添夜夜添国产精品| 国产91精品免费| 欧美α欧美αv大片| 亚洲成人免费视频| 91日韩精品一区| 亚洲精品一区二区三区精华液| 亚洲v中文字幕| 色综合久久天天| 国产精品家庭影院| 国产精品1024久久| 久久人人爽人人爽| 久久精品国产77777蜜臀| 欧美日韩国产欧美日美国产精品| 中文字幕亚洲欧美在线不卡| 国产黄人亚洲片| 久久―日本道色综合久久| 精品一区二区在线视频| 欧美一级片在线观看| 天堂午夜影视日韩欧美一区二区| 91视频一区二区| 亚洲人成影院在线观看| 99re亚洲国产精品| 亚洲视频一区在线观看| 99re这里只有精品首页| 国产精品看片你懂得| 成人激情综合网站| 1024精品合集| 色美美综合视频| 亚洲综合在线第一页| 91成人免费网站| 午夜日韩在线电影| 欧美一区二区免费视频| 蜜桃精品视频在线观看| 精品久久久久久久久久久久包黑料 | 亚洲成人久久影院| 欧美日韩国产精品成人| 视频在线在亚洲| 欧美tickle裸体挠脚心vk| 精品一区二区久久久| 久久久久久久久久电影| 成人不卡免费av| 一个色在线综合| 91精品国产欧美一区二区成人| 奇米精品一区二区三区四区| 精品美女在线观看| av成人免费在线观看| 亚洲综合一二区| 日韩免费观看高清完整版| 国产激情一区二区三区| 亚洲精品成人在线| 欧美日韩成人在线| 国产一区二区三区最好精华液| 国产精品毛片高清在线完整版| 欧美无人高清视频在线观看| 麻豆成人久久精品二区三区红| 国产日韩影视精品| 欧美视频一区在线观看| 精品一区二区三区av| 国产精品久久久久三级| 欧美精品在线一区二区| 成人午夜激情片| 午夜av一区二区三区| 久久精品人人做人人综合| 欧洲精品视频在线观看| 激情另类小说区图片区视频区| 国产精品美女一区二区三区| 欧美一区二区高清| 99国产精品视频免费观看| 久久精品国产亚洲一区二区三区| 国产精品国产三级国产普通话三级| 欧美日韩午夜在线| 不卡视频免费播放| 蜜桃视频在线观看一区二区| 樱桃国产成人精品视频| 久久久www免费人成精品| 欧美日韩在线播放三区四区| 国产91高潮流白浆在线麻豆 | 亚洲bt欧美bt精品777| 欧美经典三级视频一区二区三区| 欧美精品在线观看一区二区| 成人av高清在线| 精品一区二区三区视频| 婷婷中文字幕一区三区| 亚洲黄色在线视频| 中文字幕精品一区二区三区精品| 日韩欧美国产不卡| 91.麻豆视频| 欧美日韩高清影院| 在线视频你懂得一区| 97se亚洲国产综合在线| 国产精品18久久久久久久久久久久| 天天射综合影视| 亚洲香蕉伊在人在线观| 亚洲综合色自拍一区| 亚洲欧洲在线观看av| 中文字幕不卡三区| 日本一区二区视频在线| 久久欧美中文字幕| 国产欧美日韩在线看| 日本一区二区高清|