目錄
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,達不...