在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Redis 過(guò)期監(jiān)聽(tīng)怎么實(shí)現(xiàn)的

馬哥Linux運(yùn)維 ? 來(lái)源:Hollis ? 作者:Hollis ? 2022-07-01 11:14 ? 次閱讀

目錄

前言

Redis 過(guò)期監(jiān)聽(tīng)

RabbitMQ 死信

時(shí)間輪

結(jié)論

前言

日前拜讀阿牛老師的大作《領(lǐng)導(dǎo):誰(shuí)再用定時(shí)任務(wù)實(shí)現(xiàn)關(guān)閉訂單,立馬滾蛋!》發(fā)現(xiàn)其方案有若干瑕疵,特此拋磚引玉討論一二。

在電商、支付等領(lǐng)域,往往會(huì)有這樣的場(chǎng)景,用戶下單后放棄支付了,那這筆訂單會(huì)在指定的時(shí)間段后進(jìn)行關(guān)閉操作。

細(xì)心的你一定發(fā)現(xiàn)了像某寶、某東都有這樣的邏輯,而且時(shí)間很準(zhǔn)確,誤差在 1s 內(nèi),那他們是怎么實(shí)現(xiàn)的呢?

一般實(shí)現(xiàn)的方法有幾種:

使用 RocketMQ、RabbitMQ、Pulsar 等消息隊(duì)列的延時(shí)投遞功能

使用 Redisson 提供的 DelayedQueue

有一些方案雖然廣為流傳但存在著致命缺陷,不要用來(lái)實(shí)現(xiàn)延時(shí)任務(wù):

使用 Redis 的過(guò)期監(jiān)聽(tīng)

使用 RabbitMQ的死信隊(duì)列

使用非持久化的時(shí)間輪

Redis 過(guò)期監(jiān)聽(tīng)

在 Redis 官方手冊(cè)的 keyspace-notifications: timing-of-expired-events 中明確指出:

Basically expired events are generated when the Redis server deletes the key and not when the time to live theoretically reaches the value of zero

Redis 自動(dòng)過(guò)期的實(shí)現(xiàn)方式是:定時(shí)任務(wù)離線掃描并刪除部分過(guò)期鍵;在訪問(wèn)鍵時(shí)惰性檢查是否過(guò)期并刪除過(guò)期鍵。

Redis 從未保證會(huì)在設(shè)定的過(guò)期時(shí)間立即刪除并發(fā)送過(guò)期通知。實(shí)際上,過(guò)期通知晚于設(shè)定的過(guò)期時(shí)間數(shù)分鐘的情況也比較常見(jiàn)。

此外鍵空間通知采用的是發(fā)送即忘(fire and forget)策略,并不像消息隊(duì)列一樣保證送達(dá)。當(dāng)訂閱事件的客戶端會(huì)丟失所有在斷線期間所有分發(fā)給它的事件。

這是一種比定時(shí)掃描數(shù)據(jù)庫(kù)更 “LOW” 的解決方案,請(qǐng)不要使用。

RabbitMQ 死信

死信(Dead Letter)是 RabbitMQ 提供的一種機(jī)制。

當(dāng)一條消息滿足下列條件之一那么它會(huì)成為死信:

消息被否定確認(rèn)(如 channel.basicNack)并且此時(shí) requeue 屬性被設(shè)置為 false。

消息在隊(duì)列的存活時(shí)間超過(guò)設(shè)置的 TTL 時(shí)間

消息隊(duì)列的消息數(shù)量已經(jīng)超過(guò)最大隊(duì)列長(zhǎng)度

若配置了死信隊(duì)列,死信會(huì)被 RabbitMQ 投到死信隊(duì)列中。

在 RabbitMQ 中創(chuàng)建死信隊(duì)列的操作流程大概是:

創(chuàng)建一個(gè)交換機(jī)作為死信交換機(jī)

在業(yè)務(wù)隊(duì)列中配置 x-dead-letter-exchange 和 x-dead-letter-routing-key,將第一步的交換機(jī)設(shè)為業(yè)務(wù)隊(duì)列的死信交換機(jī)

在死信交換機(jī)上創(chuàng)建隊(duì)列,并監(jiān)聽(tīng)此隊(duì)列

死信隊(duì)列的設(shè)計(jì)目的是為了存儲(chǔ)沒(méi)有被正常消費(fèi)的消息,便于排查和重新投遞。死信隊(duì)列同樣也沒(méi)有對(duì)投遞時(shí)間做出保證,在第一條消息成為死信之前,后面的消息即使過(guò)期也不會(huì)投遞為死信。

為了解決這個(gè)問(wèn)題,Rabbit 官方推出了延遲投遞插件 rabbitmq-delayed-message-exchange ,推薦使用官方插件來(lái)做延時(shí)消息。

這里說(shuō)點(diǎn)題外話,使用 Redis 過(guò)期監(jiān)聽(tīng)或者 RabbitMQ 死信隊(duì)列做延時(shí)任務(wù)都是以設(shè)計(jì)者預(yù)想之外的方式使用中間件,這種出其不意必自斃的行為通常會(huì)存在某些隱患,比如缺乏一致性和可靠性保證,吞吐量較低、資源泄漏等。

比較出名的一個(gè)事例是很多人使用 Redis 的 List 作為消息隊(duì)列,以致于最后作者看不下去寫(xiě)了 Disque 并最后演變?yōu)?Redis Stream。工作中還是盡量不要濫用中間件,用專業(yè)的組件做專業(yè)的事。

時(shí)間輪

時(shí)間輪是一種很優(yōu)秀的定時(shí)任務(wù)的數(shù)據(jù)結(jié)構(gòu),然而絕大多數(shù)時(shí)間輪實(shí)現(xiàn)是純內(nèi)存沒(méi)有持久化的。

運(yùn)行時(shí)間輪的進(jìn)程崩潰之后其中所有的任務(wù)都會(huì)灰飛煙滅,所以奉勸各位勇士謹(jǐn)慎使用。

| Redisson DelayQueue

Redisson DelayQueue 是一種基于 Redis Zset 結(jié)構(gòu)的延時(shí)隊(duì)列實(shí)現(xiàn)。DelayQueue 中有一個(gè)名為 timeoutSetName 的有序集合,其中元素的 score 為投遞時(shí)間戳。

DelayQueue 會(huì)定時(shí)使用 zrangebyscore 掃描已到投遞時(shí)間的消息,然后把它們移動(dòng)到就緒消息列表中。

DelayQueue 保證 Redis 不崩潰的情況下不會(huì)丟失消息,在沒(méi)有更好的解決方案時(shí)不妨一試。

在數(shù)據(jù)庫(kù)索引設(shè)計(jì)良好的情況下,定時(shí)掃描數(shù)據(jù)庫(kù)中未完成的訂單產(chǎn)生的開(kāi)銷并沒(méi)有想象中那么大。

在使用 Redisson DelayQueue 等定時(shí)任務(wù)中間件時(shí)可以同時(shí)使用掃描數(shù)據(jù)庫(kù)的方法作為補(bǔ)償機(jī)制,避免中間件故障造成任務(wù)丟失。

結(jié)論

總結(jié)了幾點(diǎn)如下:

首先推薦使用 RocketMQ、Pulsar 等擁有定時(shí)投遞功能的消息隊(duì)列。

在不方便獲得專業(yè)消息隊(duì)列時(shí)可以考慮使用 Redisson DelayQueue 等基于 Redis 的延時(shí)隊(duì)列方案,但要為 Redis 崩潰等情況設(shè)計(jì)補(bǔ)償保護(hù)機(jī)制。

在無(wú)法使用 Redisson DelayQueue 等方案時(shí)可以考慮使用時(shí)間輪。由于時(shí)間輪重啟遠(yuǎn)比 Redis 重啟要頻繁,定時(shí)掃庫(kù)等保護(hù)機(jī)制更為重要。

永遠(yuǎn)不要使用 Redis 過(guò)期監(jiān)聽(tīng)實(shí)現(xiàn)定時(shí)任務(wù)。

原文標(biāo)題:永遠(yuǎn)不要使用Redis過(guò)期監(jiān)聽(tīng)實(shí)現(xiàn)定時(shí)任務(wù)!

文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4478

    瀏覽量

    86963
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3885

    瀏覽量

    65631
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    382

    瀏覽量

    11268

原文標(biāo)題:永遠(yuǎn)不要使用Redis過(guò)期監(jiān)聽(tīng)實(shí)現(xiàn)定時(shí)任務(wù)!

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Redis 再次開(kāi)源!

    “ ?Redis 現(xiàn)已采用 AGPLv3 開(kāi)源許可證。? ” Redis CEO 的 Blog 以下是 Redis CEO Rowan Trollope 的 Blog: 像 AWS 和 GCP 這樣
    的頭像 發(fā)表于 05-06 18:26 ?168次閱讀

    redis三種集群方案詳解

    Redis中提供的集群方案總共有三種(一般一個(gè)redis節(jié)點(diǎn)不超過(guò)10G內(nèi)存)。
    的頭像 發(fā)表于 03-31 10:46 ?428次閱讀
    <b class='flag-5'>redis</b>三種集群方案詳解

    如何監(jiān)聽(tīng)觸摸動(dòng)作是否松開(kāi)?

    使用滾輪容器(scrollWheel),需要在使用完滾輪手指松開(kāi)后切換界面,使用handleDragEvent(const DragEvent&amp; event)來(lái)監(jiān)聽(tīng)觸摸動(dòng)作,沒(méi)有找到獲取動(dòng)作松開(kāi)的API。我改怎么實(shí)現(xiàn)
    發(fā)表于 03-12 06:58

    Redis實(shí)戰(zhàn)筆記

    在目前的技術(shù)選型中,Redis 儼然已經(jīng)成為了系統(tǒng)高性能緩存方案的事實(shí)標(biāo)準(zhǔn),因此現(xiàn)在?Redis 也成為了后端開(kāi)發(fā)的基本技能樹(shù)之一。 ? 基于上述情況,今天給大家分享一份?杰哥?親筆撰寫(xiě)的內(nèi)部
    的頭像 發(fā)表于 02-09 09:12 ?271次閱讀
    <b class='flag-5'>Redis</b>實(shí)戰(zhàn)筆記

    華為云 Flexus X 加速 Redis 案例實(shí)踐與詳解

    Redis 加速鏡像,更是為開(kāi)發(fā)者提供了極大的便利。本文將詳細(xì)介紹如何利用華為云 Flexus X 實(shí)例自帶的 Redis 鏡像,快速部署并配置 Redis,以及通過(guò)實(shí)際案例展示其便捷性和高效性。 一、華為云 Flexus
    的頭像 發(fā)表于 01-23 17:52 ?238次閱讀
    華為云 Flexus X 加速 <b class='flag-5'>Redis</b> 案例實(shí)踐與詳解

    Redis Cluster之故障轉(zhuǎn)移

    1. Redis Cluster 簡(jiǎn)介 Redis Cluster 是 Redis 官方提供的 Redis 集群功能。 為什么要實(shí)現(xiàn)
    的頭像 發(fā)表于 01-20 09:21 ?685次閱讀
    <b class='flag-5'>Redis</b> Cluster之故障轉(zhuǎn)移

    過(guò)期的錫膏是否還能再使用?

    過(guò)期的錫膏是否還能再使用,取決于多個(gè)因素,包括錫膏的儲(chǔ)存條件、過(guò)期時(shí)間以及錫膏本身的特性。以下是對(duì)過(guò)期錫膏能否再使用的詳細(xì)分析:
    的頭像 發(fā)表于 12-31 09:15 ?369次閱讀

    華為云Flexus X實(shí)例,Redis性能加速評(píng)測(cè)及對(duì)比

    隨著云計(jì)算技術(shù)的飛速發(fā)展,Redis 作為一種高性能的內(nèi)存數(shù)據(jù)庫(kù),在各種應(yīng)用場(chǎng)景中發(fā)揮著越來(lái)越重要的作用。為了滿足不同用戶對(duì) Redis 性能的高要求,華為云推出了 Flexus X 實(shí)例,并提供了
    的頭像 發(fā)表于 12-29 15:47 ?388次閱讀
    華為云Flexus X實(shí)例,<b class='flag-5'>Redis</b>性能加速評(píng)測(cè)及對(duì)比

    華為云 Flexus X 輕松實(shí)現(xiàn) Redis 一主多從高效部署

    ,F(xiàn)lexus?X 預(yù)裝 Redis 加速鏡像,簡(jiǎn)化了 Redis 的安裝和配置流程,降低了技術(shù)門(mén)檻,使開(kāi)發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。 ????????本文將詳細(xì)介紹如何在華為云 Flexus?X 上
    的頭像 發(fā)表于 12-27 13:45 ?408次閱讀
    華為云 Flexus X 輕松<b class='flag-5'>實(shí)現(xiàn)</b> <b class='flag-5'>Redis</b> 一主多從高效部署

    Redis緩存與Memcached的比較

    Redis和Memcached都是廣泛使用的內(nèi)存數(shù)據(jù)存儲(chǔ)系統(tǒng),它們主要用于提高應(yīng)用程序的性能,通過(guò)減少對(duì)數(shù)據(jù)庫(kù)的直接訪問(wèn)來(lái)加速數(shù)據(jù)檢索。以下是對(duì)Redis和Memcached的比較,涵蓋了它們的一些
    的頭像 發(fā)表于 12-18 09:33 ?456次閱讀

    nginx+lua+redis實(shí)現(xiàn)灰度發(fā)布

    作者:馬仁喜 前言: 授人以魚(yú)不如授人以漁 .先學(xué)會(huì)用,在學(xué)原理,在學(xué)創(chuàng)造,可能一輩子用不到這種能力,但是不能不具備這種能力。這篇文章主要是沉淀使用nginx+lua+redis實(shí)現(xiàn)灰度,當(dāng)我們具備
    的頭像 發(fā)表于 12-17 10:01 ?325次閱讀

    聊聊緩存擊穿的解決方法

    緩存擊穿,Redis中的某個(gè)熱點(diǎn)key不存在或者過(guò)期,但是此時(shí)有大量的用戶訪問(wèn)該key。比如xxx直播間優(yōu)惠券搶購(gòu)、xxx商品活動(dòng),這時(shí)候大量用戶會(huì)在某個(gè)時(shí)間點(diǎn)一同訪問(wèn)該熱點(diǎn)事件。但是可能
    的頭像 發(fā)表于 10-23 13:54 ?414次閱讀

    過(guò)期Whois服務(wù)器成為黑客攻擊的新武器

    近日,網(wǎng)絡(luò)安全公司watchTowr創(chuàng)始人本杰明·哈里斯撰文透露過(guò)期Whois服務(wù)器可能會(huì)成為黑客攻擊的新武器。哈里斯在購(gòu)買過(guò)期域名dotmobiregistry.net時(shí)意外發(fā)現(xiàn),該域名曾用于管理
    的頭像 發(fā)表于 10-18 15:36 ?328次閱讀

    焊錫膏會(huì)過(guò)期嗎?

    焊錫膏會(huì)過(guò)期。焊錫膏的保質(zhì)期一般為6個(gè)月至1年不等,更細(xì)的超微錫膏或環(huán)氧錫膏的保質(zhì)期保質(zhì)期會(huì)斷一些,3-6個(gè)月的存儲(chǔ)壽命。具體保質(zhì)期會(huì)受到多種因素的影響,包括生產(chǎn)廠家的標(biāo)注、儲(chǔ)存條件以及使用頻率等。
    的頭像 發(fā)表于 10-09 09:29 ?558次閱讀

    華納云:重置ssl證書(shū)的方法有哪些?SSL證書(shū)過(guò)期的原因有哪些?

    ssl證書(shū)是網(wǎng)站的安全后盾,可以保障網(wǎng)站不受外界的攻擊,保證網(wǎng)站數(shù)據(jù)安全,大部分人建站后都會(huì)安裝ssl證書(shū)。怎么重置ssl證書(shū)?網(wǎng)站SSL證書(shū)過(guò)期的原因有哪些?下面大家就跟隨著華納云一起來(lái)詳細(xì)
    的頭像 發(fā)表于 09-25 13:52 ?518次閱讀
    主站蜘蛛池模板: 国产免费福利网站 | 国模绪 | 色综合激情 | 新版天堂中文在线8官网 | 婷婷综合色 | 涩久久 | 成人精品视频在线观看播放 | 国产综合视频在线观看 | 国产香蕉75在线播放 | 四只虎免费永久观看 | 亚色网站| 亚洲成在人色婷婷 | 香蕉视频国产在线观看 | 日本一区视频在线播放 | 日本亚洲欧美国产日韩ay高清 | 狠狠操天天操视频 | 午夜毛片免费看 | 国产欧美亚洲精品第二区首页 | japanesexxx日本69| 欧美日韩高清性色生活片 | 国产精品一区牛牛影视 | 午夜久久久精品 | 亚洲天堂bt| 久久一级毛片 | 国产午夜视频在永久在线观看 | 在线观看亚洲成人 | 色婷婷久 | 黄色网址有那些 | 天天躁夜夜躁狠狠躁2021 | 国内精品久久久久影院薰衣草 | 亚洲色播永久网址大全 | 天堂网在线www资源在线 | 日本口工全彩无遮拦漫画大 | 在线黄色免费观看 | 亚洲一区二区综合 | 亚洲色图综合图片 | 在线视频一区二区三区 | 亚洲五月激情综合图片区 | 欧美性猛交xxxx黑人猛交 | 好爽好紧好大的免费视频国产 | 亚洲韩国欧美一区二区三区 |