redis資料型別List的安全佇列和不安全佇列

2021-08-18 20:40:21 字數 707 閱讀 4251

在學習rpoplpush命令的時候,官方文件中有提到安全佇列和不安全的佇列,一開始沒有看懂,現在理解了做個筆記。

一般情況下,我們可以借助list來實現訊息佇列,比如乙個客戶端通過命令lpush(blpush)把訊息入隊,另乙個客戶端通過命令rpop(brpop)獲取訊息。這種方式實現的佇列是不安全的。

為什麼是不安全的呢?因為rpop命令的特性:會移除list的隊尾元素(訊息),並將這個元素(訊息)返回給客戶端。這意味著該元素就只存在於客戶端的上下文中,redis伺服器中沒有這個元素了,如果客戶端在處理這個返回元素的過程崩潰了,那麼這個元素就永遠丟失了。這種情況導致:客戶端雖然成功收到了訊息,但是卻沒有處理它。

那怎麼來實現乙個安全的佇列呢?可以使用redis的 rpoplpush (或者其阻塞版本的 brpoplpush)命令。

rpoplpush命令格式:rpoplpush  source  destination 。rpoplpush命令原子性地返回並移除 source 列表的最後乙個元素, 並把該元素放入 destination 列表的頭部。使用這個命令就可以實現安全佇列。

因為使用 rpoplpush 獲取訊息時,rpoplpush 會把訊息返給客戶端,同時把該訊息放入乙個備份訊息列表,並且這個過程是原子的,可以保證訊息的安全。當客戶端成功的處理了訊息後,就可以把此訊息從備份列表中移除了。如果客戶端因為崩潰的原因沒有處理某個訊息,那麼就可以從備份列表destination中重新獲取並處理這個訊息。

Redis資料型別 List

lpush 在對應的list頭部新增元素 127.0.0.1 6379 lpush mylist value1 integer 1 127.0.0.1 6379 lpush mylist value2 integer 2 列印出來看一下 127.0.0.1 6379 lrange mylist 0 ...

redis資料型別 List

list 列表 是鍊錶結構,新增或刪除元素是常量時間。list常用命令 lpush key value 從列表左邊新增元素 lpushx key value 從列表左邊新增元素,只有當key存在的時候才會新增,否則不執行。rpush key value 從列表右邊新增元素 rpushx key va...

Redis資料型別 List

list資料型別 lpush key value 新增list資料,value可以為多個值,假如我們使用方法新增 a b c 這個三個value的時候,實際上就執行了三次這個命令,等我們獲取資料的時候就是c b a lpushx key value 新增資料資訊,和lpush命令相反,從尾部開始新增...