Redis Zset實現延時佇列

2021-10-19 08:31:25 字數 2306 閱讀 7322

前言

本篇博文意在使用redis模擬實現延時佇列.

redis中的有序集合zset可以實現延時佇列,zset可以看作是縮小版的redis,可以看作是用來儲存鍵值對的集合,是集合名-k-v的結構,在zset中,會按照score進行排序。

有序集合中鍵值對的鍵被稱為成員,值被稱為分值,分值必須為浮點數。

命令行為

zadd

將乙個帶有給定分值的成員新增到有序集合中,返回新增元素的個數

zrange

根據元素在有序排列中的位置,從有序集合裡面獲取多個元素

zrangebyscore

根據乙個分值段來獲取在該分值段的所有元素

zrem

zrem key member-------如果給定成員存在於該有序集合,則刪除該成員

zcard

zcard key--------返回有序集合包含的成員數量

zcount

zcount key min max----------返回分值介於min 和max之間的成員數量

zscore

zsocre key member --------返回成員的分值

zincrby

zincrby key increment member -----將member成員的分值加上increment

示例

127.0

.0.1

:6379

> zadd zz 728 member1

(integer)

1127.0

.0.1

:6379

> zadd zz 729 member2

(integer)

1127.0

.0.1

:6379

> zadd zz 729 member2

(integer)

0127.0

.0.1

:6379

> zrange zz 0-1

1)"member1"2)

"member2"

127.0

.0.1

:6379

> zrangebyscore zz 728

7281

)"member1"

127.0

.0.1

:6379

> zrem zz member1

(integer)

1

第三行我們在鍵為zz的有序集合中新增了已經存在的鍵,所以返回0標識已存在,但是會覆蓋原來的值。

第四行我們通過zrange命令來獲取下標範圍的鍵值對,這裡只返回顯示了成員,如果需要返回分值,則在命令後加withscores即可。

思路把當前時間戳和延時時間相加,也就是到期時間,存入redis中,然後不斷輪詢,找到到期的,拿到再刪除即可。

實戰這裡使用redistemplate作為redis客戶端連線,放在延時佇列中的可以看成是乙個個延時任務。

為了適配不同型別的物件存入zset,這裡我們使用泛型

/**

* @author 陽光大男孩!!!

*/@data

public

class

delaytask

延時佇列具體實現,主要分為放任務和輪詢任務兩個部分,放任務

public

class

redisdelayqueue

/*** 設定延遲訊息

*/public

void

setdelaytasks

(t msg,

long delaytime)

}/**

* 監聽延遲訊息

*/public

void

listendelayloop()

catch

(interruptedexception e)

// 繼續執行

continue;}

// 獲取具體訊息的key

string it = set.

iterator()

.next()

;// 刪除成功

RabbitMQ實現延時佇列

rabbitmq實現延時佇列一般有兩種形式 第一種方式 利用兩個特性 time to live ttl dead letter exchanges dlx a訊息佇列過期 傳送給b佇列 第二種方式 利用rabbitmq的外掛程式x delay message rabbitmq可以針對佇列設定x ex...

DelayQueue 實現延時佇列

延遲佇列不需要不停的掃瞄快取 任務 輪訓等,它能夠實現在準確的時間點去執行任務。public class delaytask implements delayed public taskbase getdata public long getexpire override public long g...

實現mq延時佇列(訂單延時取消)

簡單實現mq延時佇列 1.rabbitmqconfiguration mq配置類 configuration slf4j public class rabbitmqconfiguration string host,value int port,value string username,value...