亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2019年08月27日 09:44:36   作者:雨茗良記  
這篇文章主要給大家介紹了基于redis實現定時任務的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

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

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

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

技術棧

redis / nodeJs / koa

技術重難點

  • 開啟redis的鍵空間通知功能(2.8.0及以上的版本才有此功能)
  • 盡量使用單獨的redis db來實現
  • 使用基于redis的分布式鎖來實現相關事件不會被重復消費
  • 需要二次使用的信息需要體現在redis緩存的key中
  • redis cache key使用業(yè)務前綴,避免重名覆蓋
  • 防止業(yè)務服務重啟導致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 = '&&__&&' // 內部使用的分布式鎖的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不做監(jiān)聽處理
  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對應的是接收到相關鍵過期通知后執(zhí)行的業(yè)務邏輯,比如推送短信,然后在相關processor中再次set一個定時過期的key
   }
  }
 })
 console.log('subClient init success')
})
servide/task (processor)
exports.sendMessage = async function sendMessage(expiredKey, subClient) {
 // 只處理相關業(yè)務的過期事件
 if (expiredKey.match(/^send_message/)) {
  const [prefix, userId, type] = expiredKey.split('-')
  let user = getUser(userId)
  if (user.phone) {
   push(message) // 偽代碼
   resetRedisKey(expiredKey, ttl) // 重新把key設置為一段時間后過期,過期后會再次觸發(fā)本邏輯
  }
 }
}

總結

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

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

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

相關文章

  • redis簡介_動力節(jié)點Java學院整理

    redis簡介_動力節(jié)點Java學院整理

    這篇文章主要介紹了redis簡介,Redis是一個開源的,先進的 key-value 存儲可用于構建高性能,可擴展的 Web 應用程序的解決方案,有興趣的可以了解一下
    2017-08-08
  • Redis的六種底層數據結構(小結)

    Redis的六種底層數據結構(小結)

    本文主要介紹了Redis的六種底層數據結構,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Redis服務器的啟動過程分析

    Redis服務器的啟動過程分析

    這篇文章主要介紹了Redis服務器的啟動過程分析,本文講解了初始化Redis服務器全局配置、加載配置文件、初始化服務器、加載數據、開始網絡監(jiān)聽等內容,需要的朋友可以參考下
    2015-04-04
  • redis+mysql+quartz 一種紅包發(fā)送功能的實現

    redis+mysql+quartz 一種紅包發(fā)送功能的實現

    這篇文章主要介紹了redis+mysql+quartz 一種紅包發(fā)送功能的實現的相關資料,需要的朋友可以參考下
    2017-01-01
  • RedisDesktopManager?連接redis的方法

    RedisDesktopManager?連接redis的方法

    這篇文章主要介紹了RedisDesktopManager?連接redis,需要的朋友可以參考下
    2023-08-08
  • redis-cli命令行工具的使用小結

    redis-cli命令行工具的使用小結

    redis-cli是Redis的命令行客戶端,支持多種參數用于連接、操作和管理Redis數據庫,本文給大家介紹redis-cli命令行工具的使用小結,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Redis數據結構之鏈表詳解

    Redis數據結構之鏈表詳解

    大家好,本篇文章主要講的是Redis數據結構之鏈表詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • K8s部署Redis主從集群教程

    K8s部署Redis主從集群教程

    本文介紹了在Kubernetes環(huán)境下搭建Redis集群的詳細步驟,包括環(huán)境準備、安裝NFS、創(chuàng)建PV卷、搭建Redis集群、集群初始化、主從切換測試以及開放外網端口等內容
    2025-01-01
  • 利用redisson快速實現自定義限流注解(接口防刷)

    利用redisson快速實現自定義限流注解(接口防刷)

    利用redis的有序集合即Sorted?Set數據結構,構造一個令牌桶來實施限流,而redisson已經幫我們封裝成了RRateLimiter,通過redisson,即可快速實現我們的目標,這篇文章主要介紹了利用redisson快速實現自定義限流注解,需要的朋友可以參考下
    2024-07-07
  • Redis Stream類型的使用詳解

    Redis Stream類型的使用詳解

    本文主要介紹了Redis Stream類型的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論