Redis詳解:lists資料類型及操作

來源:互聯網
上載者:User

標籤:

list是一個鏈表結構,主要功能是push、pop、擷取一個範圍的所有值等等,操作中key理解為鏈表的名字。

  系列文章:

  Redis詳解:strings資料類型及操作

  Redis詳解:hashes資料類型及操作

  Redis的list類型其實就是一個每個子項目都是string類型的雙向鏈表。鏈表的最大長度是(2的32次方)。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。

  有意思的是list的pop操作還有阻塞版本的,當我們[lr]pop一個list對象時,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加逾時時間,逾時後也會返回nil。為什麼要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去擷取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候背景工作執行緒可以立即返回,也可以避免輪詢帶來的延遲。說了這麼多,接下來看一下實際操作的方法吧:

  1、lpush

  在key對應list的頭部添加字串元素:

redis 127.0.0.1:6379> lpush mylist "world" (integer) 1 redis 127.0.0.1:6379> lpush mylist "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" redis 127.0.0.1:6379>

  在此處我們先插入了一個world,然後在world的頭部插入了一個hello。其中lrange是用於取mylist的內容。

  2、rpush

  在key對應list的尾部添加字串元素:

redis 127.0.0.1:6379> rpush mylist2 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist2 "world" (integer) 2 redis 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello" 2) "world" redis 127.0.0.1:6379>

  在此處我們先插入了一個hello,然後在hello的尾部插入了一個world。

  3、linsert

  在key對應list的特定位置之前或之後添加字串元素:

redis 127.0.0.1:6379> rpush mylist3 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist3 "world" (integer) 2 redis 127.0.0.1:6379> linsert mylist3 before "world" "there" (integer) 3 redis 127.0.0.1:6379> lrange mylist3 0 -1 1) "hello" 2) "there" 3) "world" redis 127.0.0.1:6379>

  在此處我們先插入了一個hello,然後在hello的尾部插入了一個world,然後又在world的前面插入了there。

  4、lset

  設定list中指定下標的元素值(下標從0開始):

redis 127.0.0.1:6379> rpush mylist4 "one" (integer) 1 redis 127.0.0.1:6379> rpush mylist4 "two" (integer) 2 redis 127.0.0.1:6379> rpush mylist4 "three" (integer) 3 redis 127.0.0.1:6379> lset mylist4 0 "four" OK redis 127.0.0.1:6379> lset mylist4 -2 "five" OK redis 127.0.0.1:6379> lrange mylist4 0 -1 1) "four" 2) "five" 3) "three" redis 127.0.0.1:6379>

  在此處我們依次插入了one,two,three,然後將標是0的值設定為four,再將下標是-2的值設定為five。

  5、lrem

  從key對應list中刪除count個和value相同的元素。

  count>0時,按從頭到尾的順序刪除,具體如下:

redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 2 redis 127.0.0.1:6379> rpush mylist5 "foo" (integer) 3 redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 4 redis 127.0.0.1:6379> lrem mylist5 2 "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "foo" 2) "hello" redis 127.0.0.1:6379>

  count<0時,按從尾到頭的順序刪除,具體如下:

redis 127.0.0.1:6379> rpush mylist6 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist6 "hello" (integer) 2 redis 127.0.0.1:6379> rpush mylist6 "foo" (integer) 3 redis 127.0.0.1:6379> rpush mylist6 "hello" (integer) 4 redis 127.0.0.1:6379> lrem mylist6 -2 "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "foo" redis 127.0.0.1:6379>

  count=0時,刪除全部,具體如下:

redis 127.0.0.1:6379> rpush mylist7 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist7 "hello" (integer) 2 redis 127.0.0.1:6379> rpush mylist7 "foo" (integer) 3 redis 127.0.0.1:6379> rpush mylist7 "hello" (integer) 4 redis 127.0.0.1:6379> lrem mylist7 0 "hello" (integer) 3 redis 127.0.0.1:6379> lrange mylist7 0 -1 1) "foo" redis 127.0.0.1:6379>

6、ltrim

  保留指定key 的值範圍內的資料:

redis 127.0.0.1:6379> rpush mylist8 "one" (integer) 1 redis 127.0.0.1:6379> rpush mylist8 "two" (integer) 2 redis 127.0.0.1:6379> rpush mylist8 "three" (integer) 3 redis 127.0.0.1:6379> rpush mylist8 "four" (integer) 4 redis 127.0.0.1:6379> ltrim mylist8 1 -1 OK redis 127.0.0.1:6379> lrange mylist8 0 -1 1) "two" 2) "three" 3) "four" redis 127.0.0.1:6379>

  7、lpop

  從list的頭部刪除元素,並返回刪除元素:

redis 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" redis 127.0.0.1:6379> lpop mylist "hello" redis 127.0.0.1:6379> lrange mylist 0 -1 1) "world" redis 127.0.0.1:6379>

  8、rpop

  從list的尾部刪除元素,並返回刪除元素:

redis 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello" 2) "world" redis 127.0.0.1:6379> rpop mylist2 "world" redis 127.0.0.1:6379> lrange mylist2 0 -1 1) "hello" redis 127.0.0.1:6379>

  9、rpoplpush

  從第一個list的尾部移除元素並添加到第二個list的頭部,最後返回被移除的元素值,整個操作是原子的.如果第一個list是空或者不存在返回nil:

redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" 2) "foo" 3) "hello" redis 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "foo" redis 127.0.0.1:6379> rpoplpush mylist5 mylist6 "hello" redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" 2) "foo" redis 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "hello" 3) "foo" redis 127.0.0.1:6379>

  10、lindex

  返回名稱為key的list中index位置的元素:

redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" 2) "foo" redis 127.0.0.1:6379> lindex mylist5 0 "three" redis 127.0.0.1:6379> lindex mylist5 1 "foo" redis 127.0.0.1:6379>

  11、llen

  返回key對應list的長度:

redis 127.0.0.1:6379> llen mylist5 (integer) 2 redis 127.0.0.1:6379>

Redis詳解:lists資料類型及操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.