redis列表系列之一

2021-09-24 02:43:10 字數 4459 閱讀 7346

目錄

lpush

lpushx

rpush

rpushx

lpop

rpop

rpoplpush 模式

1.語法

lpush key value [value]

2.解析

將乙個或多個值value插入到列表key的表頭

如果有多個value值,那麼各個value值按從左到右的順序依次插入到表頭:比如說,對空列表mylist

執行命令lpush mylist a b c,列表的值將是c,b,a,這等同於原子性地執行lpush mylist a等三個命令

如果key不存在,乙個空列表會被建立並執行lpush操作

當key存在但不是列表型別時,返回乙個錯誤

2.4以前lpush只接受單個value值

3.返回值:

執行lpush命令後,列表的長度

4.例子:

#加入單個元素

lpush student sunny

#加入重複元素

lpush student sunny

lrange student 0 -1

#加入多個元素

lpush student sunny jack sony

lrange student 0 -1

1.語法

lpushx key value

2.解析

將值value插入到列表key的表頭,當且僅當key存在並且是乙個列表

當key不存在時,lpushx什麼也不做

3.返回值:

lpushx命令執行之後,表的長度

4.例子:

#對空列表執行lpushx

llen student

lpushx student sunny  //失敗 因為列表為空

#對非空列表執行lpushx

lpush student sunny

lpushx student jack

lrange student 0 -1

1.語法

rpush key value [value...]

2.解析

將乙個或多個值value插入到列表key的表尾(最右邊)

如果有多個value值,那麼各個value值按從左到右的順序依次插入到表尾

比如乙個空列表m執行rpush m a b c,得出的結果列表為a b c,相當於執行三個命令

如果key不存在,乙個空列表會被建立並執行rpush操作

當key存在但不是列表型別是,返回乙個錯誤

2.4以前的rpush命令,只接受單個value值

3.返回值:

執行rpush操作之後,表的長度

4.例子:

#新增單個元素

rpush student sunny

#新增重複元素

rpush student sunny

lrange studeny  0 -1

#新增多個元素

rpush student sunny jack sony

lrange student 0 -1

1.語法

rpushx key value

2.解析

將值value插入到列表key的末尾,當且僅當key存在並且是乙個列表

當key不存在時,rpushx命令什麼也不做

3.返回值:

rpushx命令執行之後,表的長度

4.例子:

#key不存在

llen student

rpushx student sunny //執行失敗 不存在的key

#key存在並且是乙個非空列表

rpush student sunny

rpushx student jack

lrange student 0 -1

1.語法

lpop key

2.解析

移除並返回列表key的元素頭

3.返回值:

列表的頭元素,當key不存在,返回nil

4.例子:

llen student 

rpush student sunny

rpush student jack 

lpop student

1.語法

rpop key

2.解析

移除並返回列表key的尾元素

3.返回值:

列表的尾元素,當key不存在時,返回nil

4.例子:

rpush student sunny

rpush student jack 

rpush student sony

rpop student 

lrange student 0 -1

1.語法

rpoplpush source destination

2.解析

命令rpoplpush在乙個原子時間內,執行以下兩個動作:

將列表source中的最後乙個元素彈出(尾元素),並返回給客戶端

將source彈出的元素插入到列表destination,作為destination列表的頭元素

舉個例子:

有兩個列表source和desitination,source列表有元素a,b,c,destination有元素想,x,y,z

執行rpoplpush之後,source列表元素包含a,b,destination有c,x,y,z,並且返回元素c給客戶端

如果source不存在,值nil被返回,並且不執行其他動作

如果source和destination相同,則列表中的表尾元素被移動到表頭,並返回該元素,可以把這種情況視作列表的旋轉操作

3.返回值:

被彈出的元素

4.例子:

#s和d不同

lpush s a b c d

rpoplpush s d

lrange s 0 -1

lrange d 0 -1

#s和d相同

rpush s  1 2 3 4

lrange s 0 -1

rpoplpush s s

lrange s 0 -1

模式:安全的佇列

redis的列表經常被用作佇列,用於不同程式之間有序地交換資訊.乙個客戶d端通過lpush命令將訊息放入佇列中

而另乙個客戶端通過rpop或者brpop命令取出佇列中等待時間最長的訊息

注意的是,上面的佇列方法是不可靠的,因為在這個過程中,乙個客戶端可能在取出乙個訊息之後崩潰,

而未處理完的訊息也因此丟失。

使用rpoplpush命令可以解決這個問題,因為它不僅返回乙個訊息,同時將這個訊息新增到另乙個備份列表當中

如果一切正常的話,當乙個客戶端完成某個訊息的處理之後,可以用lrem命令將這個訊息從備份中刪除

最後,還可以新增乙個客戶端專門用於監視備份表,它自動地將超過一定處理時限的訊息重新放入到佇列中區,這樣不會丟失任何笑了

模式:迴圈列表

通過使用相同的key作為rpoplpush命令的兩個引數,客戶端可以用乙個接乙個地獲取列表元素的方式

取得列表的所有元素,而不必像lrange命令那樣一下子將所有列表元素都從伺服器傳送到客戶端

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

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

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

這個模式使得我們可以很容易實現這一類系統:有n個客戶端,需要連續不斷的對一些元素進行處理

而且處理的過程必須盡可能的快.乙個典型的例子就是伺服器的監控程式,他們需要在短時間內

,並行的檢查一組**,確保他們的可訪問性。

redis有序集合系列之一

目錄 zend zscore zincrby zcard zcount 1.語法 zend key score member score member score member 2.解析 將乙個或多個member元素及其score值加入到有序集key當中。如果某個member已經是有序集的成員,那麼...

redis列表底層實現之一 鍊錶

注意標題中的 之一 那麼什麼情況下,列表會使用鍊錶作為其資料結構呢?答案就是 列表鍵包含了大量的元素,或者列表中包含的元素都是比較長的字串。ok,由於鍊錶大家都比較熟悉,接下來就直接給出鍊錶和鍊錶節點的實現。鍊錶節點 typedef struct listnode listnode 鍊錶 typed...

Redis系列 列表 List (八)

redis列表是簡單的字串列表,按照插入順序排序。你可以新增乙個元素導列表的頭部 左邊 或者尾部 右邊 乙個列表最多可以包含 232 1 個元素 4294967295,每個列表超過40億個元素 redis 127.0 0.1 6379 lpush runoobkey redis integer 1 ...