redis列表系列之三

2021-09-24 03:26:46 字數 3483 閱讀 4488

目錄

blpop

brpop

brpoplpush

1.語法

blpop key [key …] timeout

2.解析

blpop的列表的阻塞式彈出原語。

它是lpop命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連線將被blpop命令阻塞,

直到等待超時或被發現可彈元素為止。

當給定多個key引數時,按引數key的先後順序依次檢查各個列表,彈出第乙個非空列表的頭元素

非阻塞行為

當blpop被呼叫時,如果給定key內至少有乙個非空列表,那麼彈出遇到的第乙個非空列表的頭元素,

並和被彈出元素所屬的列表名字一起,組成結果返回給呼叫者。

當存在多個給定的key時,blpop按給定key引數排列的先後順序,依次檢查各個列表

假設現在有m,p和l三個列表,其中m不存在,p和l都持有非空列表,以下命令:

blpop m p l 0

blpop保證返回的元素來自p,因為它是按m->p->l的順序查詢的,第乙個找到的非空列表

del m p l #確保其中的key被刪除

lpush p 'pink'

lpush l 'link'

blpop m p l 0   //m列表為空 跳過 緊接著p列表的第乙個元素被彈出

1) "p"          //所屬的列表

2) "pink"       //元素所屬的值

阻塞行為

如果所有給定的key都不存在或包含空列表,那麼blpop命令將阻塞鏈結,直到等待超時,

或有另乙個客戶端對給定key的任意乙個執行lpush或rpush命令為止

超時引數timeout接受乙個以秒為單位的數字作為值。超時引數設為0表示阻塞時間可以無限期延長

exists m

exists p

blpop m p 300  //由於key不存在所以阻塞 使用另乙個客戶端對m或者p進行操作

另乙個客戶端操作:lpush m hello

上面blpop返回

1) "m"

2) "hello"

(60.99s)

blpop m p 5//等待超時的情況

(nil)

(5.08s)

相同的key被多個客戶端同時阻塞

相同的key可以被多個客戶端同時阻塞

不同的客戶端被放進乙個佇列中,按先阻塞先服務的順序為key執行blpop命令

在multi/exec事務中的blpop

blpop可以用於流水線,但是把它用在multi/exec塊當中沒有意義,因為這要求整個伺服器被阻塞以保證塊執行時的原子性

該行為組織了其他客戶端執行lpush或rpush命令

因此,乙個唄包裹在multi/exec塊內的blpop命令,行為表現的就像lpop一樣,對空列表返回nil

對非空列表彈出列表元素,不進行任何阻塞行為

#對非空列表進行操作

rpush m hello

multi

blpop m 30

exec   //不阻塞立即返回

#對空列表進行操作

llen m

multi

blpop m 30

exec

3.返回值:

如果列表為空,返回乙個nil.否則,返回乙個含有兩個元素的列表,第乙個元素是被彈出元素所屬的key

第二個元素是被彈出元素的值

模式:事件提醒

有時候,為了等待乙個新元素達到資料中,需要輪詢的方式對資料進行探查

另一種更好的方式是,使用系統提供的阻塞原語,在新元素到達時立即進行處理,而新元素還沒到達時,

就一直阻塞住,避免輪詢占用資源。

對於redis,我們似乎需要乙個阻塞版的spop命令,但實際上,使用blpop或者brpop就能很好的解決這個問題

使用元素的客戶端可以執行類似以下的**:

loop forever

while spop(key) returns elements

... process elements ...

endbrpop helper_key

end新增元素的客戶端則執行以下**:

multi

sadd key element

lpush helper_key x

exec

1.語法

brpop key [key...]timeout

2.解析

brpop是列表的阻塞式彈出原語

它是rpop命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連線將被brpop命令阻塞

直到等待超時或發現可彈出元素為止

當個給定多個key引數時,按引數key的先後執行順序依次檢查各個列表,彈出第乙個非空列表的尾部元素

3.返回值:

假如在指定時間內沒有任何元素彈出,則返回乙個nil和等待時長。反之,返回乙個含有兩個元素的列表,

第乙個元素是被彈出元素所屬的key,第二個元素是被彈出元素的值

4.例子:

llen m

rpush m hello

rpush m world

brpop m 30

1.語法

brpoplpush source destination timeout

2.解析

brpoplpush是rpoplpush的阻塞版本,當給定列表source不為空時,brpoplpush的表現和rpoplpush一樣

當列表source為空時,brpoplpush命令將阻塞連線,直到等待超時,或有另乙個客戶端對source執行

lpush或rpush命令

超時引數timeout接受乙個以秒為單位的數字作為值.超時引數設為0表示阻塞時間可以無限期延長

3.返回值:

假如在指定時間內沒有任何元素被彈出,則返回乙個nil和等待時長。反之,返回乙個含有兩個元素的列表,

第乙個元素是被彈出元素的值,第二個元素是等待的時長

4.例子:

brpoplpush m  p 500

在另乙個客戶端:rpush m hello

brpoplpush會返回:

heelo

(21.20s)

llen p

lrange p 0 -1

#空列表

brpoplpush m p 1

(nil)

(1.05s)

Redis學習系列三List列表

一 簡介 redis中的列表相當於c 中的linkedlist,也就是鍊錶,如果你研究過鍊錶這個資料結構,肯定知道.它的插入和刪除是非常快的,但是定位卻很慢,因為必須遍歷所有的元素,才能找到對應的值,所以當你需要對列表進行統計的時候,建立跑後台服務去做,而不是使用redis去遍歷,因為開銷很大.re...

Redis 快取之三

我們在set key 的時候,都可以給定乙個expire time,就是過期時間,指定這個key 比如說只能存活乙個小時,那麼快取到期就會失效 定性刪除 指的是redis預設的每隔100ms就會隨機的抽取一些設定了過期時間的key,檢查是否過期,如果過期了就會刪除,但是問題是,定期刪除會導致很多過期...

專案錯誤列表之三

1.前幾天的乙個錯誤讓我鬱悶了好一陣子,我往 裡手動修改測試資料 dbms sql server 2000 資料庫有乙個字段允許為空,我需要將該字段不為空的記錄查出來,由於我的insert語句將 插入資料庫,導致這個欄位為空白,卻不是我所期望的。那麼我寫在查詢語句裡面的,is not null,達不...