標籤:
  redis的list類型其實就是一個每個子項目都是string類型的雙向鏈表。所以[lr]push和[lr]pop命令的演算法時間複雜度都是O(1)。另外list會記錄鏈表的長度。所以llen操作也是O(1).鏈表的最大長度是(2的32次方-1)。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。有意思的是list的pop操作還有阻塞版本的。當我們[lr]pop一個list對象是,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加逾時時間,逾時後也會返回nil。
  為什麼要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去擷取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候背景工作執行緒可以立即返回,也可以避免輪詢帶來的延遲。
  list相關命令:
  lpush key string 在key對應list的頭部添加字串元素,返回1表示成功,0表示key存在且不是list類型
  rpop key 從list的尾部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤
  llen key 返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤
  
  rpush key string 在key對應list的尾部添加字串元素,返回1表示成功,0表示key存在且不是list類型
  lpop key 從list的頭部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤
  
  lrange key start end 返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素,key不存在返回空列表
  ltrim key start end 截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤
  
  lset key index value 設定list中指定下標的元素值,成功返回OK,key或者下標不存在返回錯誤
  
  lrem key count value 從key對應list中刪除count個和value相同的元素。
  
  blpop key1...keyN timeout 從左至右掃描返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在,list2,list3都是非空則對list2做lpop並返回從list2中刪除的元素。
  
  如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞。當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果逾時發生,則返回nil。有點像unix的select或者poll。
  
  
  
  brpop 同blpop不再贅述,一個是從頭部刪除一個是從尾部刪除。
    rpoplpush srckey destkey 從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操作是原子的.如果srckey是空或者不存在返回nil。
    
Redis學習筆記(四)-資料類型之list類型