最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Redis實現(xiàn)訂單30分鐘自動取消

 更新時間:2022年06月27日 11:04:31   作者:打怪獸升級  
本文主要介紹了利用Redis實現(xiàn)訂單30分鐘自動取消,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

業(yè)務(wù)場景

我們以訂單功能為例說明下:

生成訂單后一段時間不支付訂單會自動關(guān)閉。最簡單的想法是設(shè)置定時任務(wù)輪詢,但是每個訂單的創(chuàng)建時間不一樣,定時任務(wù)的規(guī)則無法設(shè)定,如果將定時任務(wù)執(zhí)行的間隔設(shè)置的過短,太影響效率。

還有一種想法,在用戶進(jìn)入訂單界面的時候,判斷時間執(zhí)行相關(guān)操作。方式可能有很多,在這里介紹一種監(jiān)聽 Redis 鍵值對過期時間來實現(xiàn)訂單自動關(guān)閉。

實現(xiàn)思路

在生成訂單時,向 Redis 中增加一個 KV 鍵值對,K 為訂單號,保證通過 K 能定位到數(shù)據(jù)庫中的某個訂單即可,V 可為任意值。

假設(shè),生成訂單時向 Redis 中存放 K 為訂單號,V 也為訂單號的鍵值對,并設(shè)置過期時間為 30 分鐘,如果該鍵值對在 30 分鐘過期后能夠發(fā)送給程序一個通知,或者執(zhí)行一個方法,那么即可解決訂單關(guān)閉問題。

實現(xiàn):通過監(jiān)聽 Redis 提供的過期隊列來實現(xiàn),監(jiān)聽過期隊列后,如果 Redis 中某一個 KV 鍵值對過期了,那么將向監(jiān)聽者發(fā)送消息,監(jiān)聽者可以獲取到該鍵值對的 K,注意,是獲取不到 V 的,因為已經(jīng)過期了,這就是上面所提到的,為什么要保證能通過 K 來定位到訂單,而 V 為任意值即可。拿到 K 后,通過 K 定位訂單,并判斷其狀態(tài),如果是未支付,更新為關(guān)閉,或者取消狀態(tài)即可。

開啟 Redis key 過期提醒

修改 redis 相關(guān)事件配置。找到 redis 配置文件 redis.conf,查看 notify-keyspace-events 配置項,如果沒有,添加 notify-keyspace-events Ex,如果有值,則追加 Ex,相關(guān)參數(shù)說明如下:

  • K:keyspace 事件,事件以 keyspace@ 為前綴進(jìn)行發(fā)布
  • E:keyevent 事件,事件以 keyevent@ 為前綴進(jìn)行發(fā)布
  • g:一般性的,非特定類型的命令,比如del,expire,rename等
  • $:字符串特定命令
  • l:列表特定命令
  • s:集合特定命令
  • h:哈希特定命令
  • z:有序集合特定命令
  • x:過期事件,當(dāng)某個鍵過期并刪除時會產(chǎn)生該事件
  • e:驅(qū)逐事件,當(dāng)某個鍵因 maxmemore 策略而被刪除時,產(chǎn)生該事件
  • A:g$lshzxe的別名,因此”AKE”意味著所有事件

引入依賴

在 pom.xml 中添加 org.springframework.boot:spring-boot-starter-data-redis 依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

相關(guān)配置

定義配置 RedisListenerConfig 實現(xiàn)監(jiān)聽 Redis key 過期時間

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisListenerConfig {

? ? @Bean
? ? RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

? ? ? ? RedisMessageListenerContainer container = new RedisMessageListenerContainer();
? ? ? ? container.setConnectionFactory(connectionFactory);
? ? ? ? return container;
? ? }
}

定義監(jiān)聽器 RedisKeyExpirationListener,實現(xiàn)KeyExpirationEventMessageListener 接口,查看源碼發(fā)現(xiàn),該接口監(jiān)聽所有 db 的過期事件 keyevent@*:expired"

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
?* 監(jiān)聽所有db的過期事件__keyevent@*__:expired"
?*/
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

? ? public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
? ? ? ? super(listenerContainer);
? ? }

? ? /**
? ? ?* 針對 redis 數(shù)據(jù)失效事件,進(jìn)行數(shù)據(jù)處理
? ? ?* @param message
? ? ?* @param pattern
? ? ?*/
? ? @Override
? ? public void onMessage(Message message, byte[] pattern) {

? ? ? ? // 獲取到失效的 key,進(jìn)行取消訂單業(yè)務(wù)處理
? ? ? ? String expiredKey = message.toString();
? ? ? ? System.out.println(expiredKey);
? ? }
}

redis 過期監(jiān)聽真的好么?

在 Redis 官方手冊的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 自動過期的實現(xiàn)方式是:定時任務(wù)離線掃描并刪除部分過期鍵;在訪問鍵時惰性檢查是否過期并刪除過期鍵。redis 從未保證會在設(shè)定的過期時間立即刪除并發(fā)送過期通知。實際上,過期通知晚于設(shè)定的過期時間數(shù)分鐘的情況也比較常見。

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

這是一種比定時掃描數(shù)據(jù)庫更 “LOW” 的解決方案,不建議使用。

實現(xiàn)關(guān)閉訂單的方法

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

  • 使用 rocketmq、rabbitmq、pulsar 等消息隊列的延時投遞功能
  • 使用 redisson 提供的 DelayedQueue

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

  • 使用 redis 的過期監(jiān)聽
  • 使用 rabbitmq 的死信隊列
  • 使用非持久化的時間輪

到此這篇關(guān)于利用Redis實現(xiàn)訂單30分鐘自動取消的文章就介紹到這了,更多相關(guān)Redis訂單30分鐘自動取消內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis中List類型的常用命令

    Redis中List類型的常用命令

    本文主要介紹了Redis中List類型的常用命令,包含12種常用命令,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 關(guān)于Redis庫存超賣問題的分析

    關(guān)于Redis庫存超賣問題的分析

    在高并發(fā)場景下進(jìn)行優(yōu)惠券秒殺測試時,發(fā)現(xiàn)由于并發(fā)操作導(dǎo)致了超賣問題,即理論上只能賣出100個優(yōu)惠券,實際賣出了102個,分析原因,是因為在高并發(fā)環(huán)境下,多個線程同時操作庫存,導(dǎo)致數(shù)據(jù)不一致,提出了兩種解決方案:悲觀鎖和樂觀鎖
    2024-11-11
  • 詳解Redis如何多規(guī)則限流和防重復(fù)提交

    詳解Redis如何多規(guī)則限流和防重復(fù)提交

    市面上很多介紹redis如何實現(xiàn)限流的,但是大部分都有一個缺點,就是只能實現(xiàn)單一的限流,但是如果想一個接口兩種規(guī)則都需要滿足呢,使用本文就來介紹一下redis實現(xiàn)分布式多規(guī)則限流的方式吧
    2023-12-12
  • redis緩存數(shù)據(jù)庫中數(shù)據(jù)的方法

    redis緩存數(shù)據(jù)庫中數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了redis緩存數(shù)據(jù)庫中數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Redis的Hash類型及相關(guān)命令小結(jié)

    Redis的Hash類型及相關(guān)命令小結(jié)

    edis Hash是一種數(shù)據(jù)結(jié)構(gòu),用于存儲字段和值的映射關(guān)系,本文就來介紹一下Redis的Hash類型及相關(guān)命令小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • Redis 對過期數(shù)據(jù)的處理方法

    Redis 對過期數(shù)據(jù)的處理方法

    這篇文章主要介紹了Redis 對過期數(shù)據(jù)的處理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 詳解Redis基本命令與使用場景

    詳解Redis基本命令與使用場景

    REmote DIctionary Server(Redis)是一個由Salvatore Sanfilippo寫的key-value 存儲系統(tǒng),是跨平臺的非關(guān)系型數(shù)據(jù)庫,是一個開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存、分布式、可選持久性的鍵值對(Key-Value)存儲數(shù)據(jù)庫,并提供多種語言的 API。
    2021-06-06
  • Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法

    Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法

    Redis數(shù)據(jù)庫依賴于主存,在關(guān)系型數(shù)據(jù)庫以外再配套Redis管理緩存數(shù)據(jù)將對性能會有很大的提升,這里我們就來看一下Python的Flask框架使用Redis做數(shù)據(jù)緩存的配置方法
    2016-06-06
  • K8s部署Redis主從集群教程

    K8s部署Redis主從集群教程

    本文介紹了在Kubernetes環(huán)境下搭建Redis集群的詳細(xì)步驟,包括環(huán)境準(zhǔn)備、安裝NFS、創(chuàng)建PV卷、搭建Redis集群、集群初始化、主從切換測試以及開放外網(wǎng)端口等內(nèi)容
    2025-01-01
  • 一篇文章帶你弄清楚Redis的精髓

    一篇文章帶你弄清楚Redis的精髓

    Redis是一個開源的、支持網(wǎng)絡(luò)、基于內(nèi)存的鍵值對存儲系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。它支持多種數(shù)據(jù)類型,包括字符串、散列、列表、集合、位圖等,擁有極快的讀寫速度,并且支持豐富的特性,如事務(wù)、持久化、復(fù)制、腳本、發(fā)布/訂閱等。
    2023-02-02

最新評論

顺义区| 临沂市| 会同县| 荃湾区| 东阳市| 新郑市| 龙泉市| 福清市| 新疆| 高密市| 留坝县| 察隅县| 定日县| 昭平县| 珲春市| 呼和浩特市| 沅江市| 伊春市| 府谷县| 富阳市| 平武县| 综艺| 襄汾县| 布拖县| 西藏| 凌源市| 顺昌县| 临朐县| 依兰县| 平果县| 阳朔县| 谢通门县| 格尔木市| 临泉县| 无为县| 白水县| 苍梧县| 乐都县| 屏东市| 安岳县| 太谷县|