2.4 lists類(lèi)型及操作 list是一個(gè)鏈表結(jié)構(gòu),主要功能是push、pop、獲取一個(gè)范圍的所有值等等,操作中key理解為鏈表的名字。 Redis的list類(lèi)型其實(shí)就是一個(gè)每個(gè)子元素都是string類(lèi)型的雙向鏈表。鏈表的最大長(zhǎng)度是(2的32次方)。我們可以通過(guò)push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊(duì)列。 有意思的是list的pop操作還有阻塞版本的,當(dāng)我們[lr]pop一個(gè)list對(duì)象時(shí),如果list是空,或者不存在,會(huì)立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當(dāng)然可以加超時(shí)時(shí)間,超時(shí)后也會(huì)返回nil。為什么要阻塞版本的pop呢,主要是為了避免輪詢。舉個(gè)簡(jiǎn)單的例子如果我們用list來(lái)實(shí)現(xiàn)一個(gè)工作隊(duì)列。執(zhí)行任務(wù)的thread可以調(diào)用阻塞版本的pop去獲取任務(wù)這樣就可以避免輪詢?nèi)z查是否有任務(wù)存在。當(dāng)任務(wù)來(lái)時(shí)候工作線程可以立即返回,也可以避免輪詢帶來(lái)的延遲。說(shuō)了這么多,接下來(lái)看一下實(shí)際操作的方法吧: 2.4.1 lpush 在key對(duì)應(yīng)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> |
在此處我們先插入了一個(gè)world,然后在world的頭部插入了一個(gè)hello。其中lrange是用于取mylist的內(nèi)容。 2.4.2 rpush 在key對(duì)應(yīng)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> |
在此處我們先插入了一個(gè)hello,然后在hello的尾部插入了一個(gè)world。 2.4.3 linsert 在key對(duì)應(yīng)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> |
在此處我們先插入了一個(gè)hello,然后在hello的尾部插入了一個(gè)world,然后又在world的前面插入了there。 2.4.4 lset 設(shè)置list中指定下標(biāo)的元素值(下標(biāo)從0開(kāi)始) 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,然后將標(biāo)是0的值設(shè)置為four,再將下標(biāo)是-2的值設(shè)置為five。 2.5.5 lrem 從key對(duì)應(yīng)list中刪除count個(gè)和value相同的元素。 count>0時(shí),按從頭到尾的順序刪除,具體如下: 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時(shí),按從尾到頭的順序刪除,具體如下: 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時(shí),刪除全部,具體如下: 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> |
2.4.6 ltrim 保留指定key 的值范圍內(nèi)的數(shù)據(jù) 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> |
2.4.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> |
2.4.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> |
2.4.9 rpoplpush 從第一個(gè)list的尾部移除元素并添加到第二個(gè)list的頭部,最后返回被移除的元素值,整個(gè)操作是原子的.如果第一個(gè)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> |
2.4.10 lindex 返回名稱(chēng)為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> |
2.4.11 llen 返回key對(duì)應(yīng)list的長(zhǎng)度 redis 127.0.0.1:6379> llen mylist5 (integer) 2 redis 127.0.0.1:6379> |
-------------------------------------------------------------------
《MongoDB管理與開(kāi)發(fā)精要》、《Redis實(shí)戰(zhàn)》作者
ChinaUnix.net專(zhuān)家 http://cdhongwan.blog.chinaunix.net
@CD紅丸 http://weibo.com/u/2446082491
|