redis rpoplpush列表轉移元素

2022-09-14 14:12:15 字數 1442 閱讀 5221

文件出處:redisdoc.com/list/rpoplpush.html

模式: 安全的佇列

redis的列表經常被用作佇列(queue),用於在不同程式之間有序地交換訊息(message)。乙個客戶端通過 lpush key value [value …] 命令將訊息放入佇列中,而另乙個客戶端通過 rpop key 或者 brpop key [key …] timeout 命令取出佇列中等待時間最長的訊息。

不幸的是,上面的佇列方法是『不安全』的,因為在這個過程中,乙個客戶端可能在取出乙個訊息之後崩潰,而未處理完的訊息也就因此丟失。

使用 rpoplpush 命令(或者它的阻塞版本 brpoplpush source destination timeout )可以解決這個問題:因為它不僅返回乙個訊息,同時還將這個訊息新增到另乙個備份列表當中,如果一切正常的話,當乙個客戶端完成某個訊息的處理之後,可以用 lrem key count value 命令將這個訊息從備份表刪除。

最後,還可以新增乙個客戶端專門用於監視備份表,它自動地將超過一定處理時限的訊息重新放入佇列中去(負責處理該訊息的客戶端可能已經崩潰),這樣就不會丟失任何訊息了。

模式:迴圈列表

通過使用相同的 key 作為 rpoplpush 命令的兩個引數,客戶端可以用乙個接乙個地獲取列表元素的方式,取得列表的所有元素,而不必像 lrange key start stop 命令那樣一下子將所有列表元素都從伺服器傳送到客戶端中(兩種方式的總複雜度都是 o(n))。

以上的模式甚至在以下的兩個情況下也能正常工作:

有多個客戶端同時對同乙個列表進行旋轉(rotating),它們獲取不同的元素,直到所有元素都被讀取完,之後又從頭開始。

有客戶端在向列表尾部(右邊)新增新元素。

這個模式使得我們可以很容易實現這樣一類系統:有 n 個客戶端,需要連續不斷地對一些元素進行處理,而且處理的過程必須盡可能地快。乙個典型的例子就是伺服器的監控程式:它們需要在盡可能短的時間內,並行地檢查一組**,確保它們的可訪問性。

注意,使用這個模式的客戶端是易於擴充套件(scala)且安全(reliable)的,因為就算接收到元素的客戶端失敗,元素還是儲存在列表裡面,不會丟失,等到下個迭代來臨的時候,別的客戶端又可以繼續處理這些元素了。

可以看出 源列表右端3被移除轉移到了destination列表裡面,客戶端並且做出了返回3的動作

Oracle 列操作 增加列,修改列,刪除列

alter table 表名 add 列名 varchar2 10 alter table 表名 modify 列名 varchar2 20 alter table 表名 drop column 列名 這裡要注意幾個地方,首先,增加和修改列是不需要加關鍵字column,否則會報錯ora 00905。...

SQL 增加列 修改列 刪除列

sql語句增加列 修改列 刪除列 1.增加列 alter table tablename add columnname varchar 30 2.1.修改列型別 alter table tablename alter column columnname varchar 4000 2.2.修改列的名稱...

MySQL 新增列,修改列,刪除列

alter table 新增,修改,刪除表的列,約束等表的定義。sp rename sqlserver 內建的儲存過程,用與修改表的定義。mysql 檢視約束,新增約束,刪除約束 新增列,修改列,刪除列 sp rename sqlserver 內建的儲存過程,用與修改表的定義。先刪除主鍵 alter...