亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

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

2020-10-28 21:29:16
字體:
來源:轉載
供稿:網友

前言

業務中碰到的需求(抽象描述一下):針對不同的用戶能夠實現不同時間的間隔循環任務。比如在用戶注冊成功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的過期機制實現的定時任務的使用場景。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av在线国产| 国产亚洲精品成人av久久ww| 91精品在线看| 草民午夜欧美限制a级福利片| 久久久免费电影| 日韩精品在线观看一区二区| 日韩中文字幕在线视频| 国产午夜精品免费一区二区三区| 久久精品2019中文字幕| 精品香蕉在线观看视频一| 欧洲中文字幕国产精品| 久久精品亚洲热| 欧美成人精品不卡视频在线观看| 日韩欧美一区二区在线| 日韩亚洲国产中文字幕| 欧美孕妇孕交黑巨大网站| 超薄丝袜一区二区| 中文字幕少妇一区二区三区| 精品欧美激情精品一区| 亚洲精品日韩在线| 欧美日韩一二三四五区| 九九热最新视频//这里只有精品| 亚洲高清久久久久久| 久久99精品久久久久久青青91| 欧美大片欧美激情性色a∨久久| 欧美激情网站在线观看| 欧美福利视频在线| 久久这里只有精品99| 午夜精品久久久久久久男人的天堂| 成人精品一区二区三区电影免费| 日韩av日韩在线观看| 亚洲自拍小视频免费观看| 国产精品海角社区在线观看| 96sao精品视频在线观看| 亚洲 日韩 国产第一| 亚洲精品美女久久| 97视频免费在线看| 欧美电影在线观看高清| 欧美亚洲另类视频| 国产91网红主播在线观看| 51视频国产精品一区二区| 91在线观看免费高清完整版在线观看| 久久久综合免费视频| 亚洲黄色成人网| 成人在线激情视频| 久久精视频免费在线久久完整在线看| 国产精品极品在线| 日韩精品免费视频| 欧亚精品中文字幕| 亚洲欧美一区二区三区在线| 亚洲第一网中文字幕| 全球成人中文在线| 成人性生交大片免费观看嘿嘿视频| 北条麻妃一区二区三区中文字幕| 午夜精品久久久99热福利| 亚洲国产精品人久久电影| 亚洲午夜激情免费视频| 日本一欧美一欧美一亚洲视频| 91国内揄拍国内精品对白| 日韩最新在线视频| 欧美性受xxxx白人性爽| 欧美日韩激情小视频| 久久91精品国产91久久久| 国产精品一区二区久久| 91免费看视频.| 欧美激情第三页| 色先锋资源久久综合5566| 中文字幕欧美亚洲| 欧美成人精品激情在线观看| 韩国三级日本三级少妇99| 宅男66日本亚洲欧美视频| 红桃视频成人在线观看| 日韩av电影院| 亚洲精品按摩视频| 2018中文字幕一区二区三区| 国产日本欧美一区| 亚洲永久免费观看| 5278欧美一区二区三区| 中文字幕精品视频| 亚洲深夜福利在线| 亚洲国产精品人久久电影| 国产精品嫩草影院久久久| 一区二区三区视频免费在线观看| 亚洲精品成a人在线观看| 欧美成人午夜视频| 在线观看欧美www| 91久久国产精品91久久性色| 亚洲国产精品电影| 欧美高清视频在线播放| 欧美日韩一区二区免费视频| 国产精品爽黄69天堂a| 亚洲国产欧美在线成人app| 日韩极品精品视频免费观看| 国产成人中文字幕| 亚洲欧洲在线视频| 亚洲一区美女视频在线观看免费| 九九热最新视频//这里只有精品| 国产精品视频成人| 欧美精品videosex极品1| 日韩精品高清视频| 欧美国产视频日韩| 欧美日韩激情小视频| 国产福利精品av综合导导航| 久久久国产成人精品| 777777777亚洲妇女| 国产成人激情小视频| 日本国产欧美一区二区三区| 国产日韩在线精品av| 欧美日韩在线视频一区二区| 久久精品亚洲精品| 久久99精品久久久久久青青91| 欧美日韩国产成人| 庆余年2免费日韩剧观看大牛| 亚洲精品一区二区三区不| 精品国产一区二区三区久久狼黑人| 琪琪亚洲精品午夜在线| 亚洲最大激情中文字幕| 日韩在线国产精品| 少妇高潮久久久久久潘金莲| 久久亚洲一区二区三区四区五区高| 亚洲精品wwwww| 91九色蝌蚪国产| 亚洲精品国产拍免费91在线| 91久久精品国产91性色| 亚洲高清福利视频| 欧美性xxxx18| 欧美精品在线播放| 欧美一级淫片aaaaaaa视频| 久久久久成人精品| 国语自产精品视频在线看| 国产精品视频区| 国产精品jizz在线观看麻豆| 91精品免费看| 97在线日本国产| 国产精品免费看久久久香蕉| 成人激情视频免费在线| 日韩美女免费观看| 色偷偷av一区二区三区| 国产精品91在线观看| 久久艳片www.17c.com| 日韩视频免费在线观看| 国产精品久久国产精品99gif| 亚洲精品456在线播放狼人| 国产精品69久久久久| 欧美xxxx14xxxxx性爽| 日韩免费观看网站| 亚洲免费人成在线视频观看| 欧美资源在线观看| 一区二区国产精品视频| 欧美在线视频一二三| 亚洲最大激情中文字幕| 欧美老女人性生活| 欧美黑人极品猛少妇色xxxxx| 欧美视频专区一二在线观看| 91爱爱小视频k| 亚洲白拍色综合图区| 日韩美女视频在线观看| 亚洲一区二区三区四区在线播放| 欧美激情综合色| 成人美女av在线直播| 亚洲另类图片色| 欧美老少配视频| 国产日本欧美在线观看| 国产91露脸中文字幕在线|