中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

NoSQL----Redis2.4--List

一、概述:

成都創(chuàng)新互聯(lián)公司是一家企業(yè)級(jí)云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營(yíng)經(jīng)驗(yàn)。主營(yíng)GPU顯卡服務(wù)器,站群服務(wù)器,雅安機(jī)房托管,海外高防服務(wù)器,大帶寬服務(wù)器,動(dòng)態(tài)撥號(hào)VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。

1、List:允許出現(xiàn)重復(fù)的元素,list可以作為棧(先進(jìn)后出)或者隊(duì)列(先進(jìn)先出)。

頭元素和尾元素:頭元素指的是列表左端/前端第一個(gè)元素;尾元素指的是列表右端/后端第一個(gè)元素。

舉個(gè)例子,列表list包含三個(gè)元素:x, y, z,其中x是頭元素,而z則是尾元素。

空列表:指不包含任何元素的列表,redis將不存在的key也視為空列表。

2、鏈表結(jié)構(gòu)的小技巧:

      針對(duì)鏈表結(jié)構(gòu)的Value,Redis在其官方文檔中給出了一些實(shí)用技巧,如RPOPLPUSH命令,下面給出具體的解釋。

      Redis鏈表經(jīng)常會(huì)被用于消息隊(duì)列的服務(wù),以完成多程序之間的消息交換。假設(shè)一個(gè)應(yīng)用程序正在執(zhí)行LPUSH操作向鏈表中添加新的元素,我們通常將這樣的程序稱之為"生產(chǎn)者(Producer)",而另外一個(gè)應(yīng)用程序正在執(zhí)行RPOP操作從鏈表中取出元素,我們稱這樣的程序?yàn)?消費(fèi)者(Consumer)"。如果此時(shí),消費(fèi)者程序在取出消息元素后立刻崩潰,由于該消息已經(jīng)被取出且沒(méi)有被正常處理,那么我們就可以認(rèn)為該消息已經(jīng)丟失,由此可能會(huì)導(dǎo)致業(yè)務(wù)數(shù)據(jù)丟失,或業(yè)務(wù)狀態(tài)的不一致等現(xiàn)象的發(fā)生。然而通過(guò)使用RPOPLPUSH命令,消費(fèi)者程序在從主消息隊(duì)列中取出消息之后再將其插入到備份隊(duì)列中,直到消費(fèi)者程序完成正常的處理邏輯后再將該消息從備份隊(duì)列中刪除。同時(shí)我們還可以提供一個(gè)守護(hù)進(jìn)程,當(dāng)發(fā)現(xiàn)備份隊(duì)列中的消息過(guò)期時(shí),可以重新將其再放回到主消息隊(duì)列中,以便其它的消費(fèi)者程序繼續(xù)處理。

二、應(yīng)用場(chǎng)景:

        獲得最新的10個(gè)登錄用戶信息:

1、使用數(shù)據(jù)庫(kù)方式需執(zhí)行如下sql語(yǔ)句:

select * from loginuser order by logintime desc limit 10;

但是數(shù)據(jù)多的時(shí)候,全部數(shù)據(jù)都要受到影響,對(duì)數(shù)據(jù)庫(kù)的負(fù)載比較高,

必要情況還要需要對(duì)關(guān)鍵字段logintime設(shè)置索引,索引也比較耗費(fèi)系統(tǒng)資源。

2、如果通過(guò)redis的list鏈表實(shí)現(xiàn)以上功能,就非常簡(jiǎn)單。可以在list鏈表中只保留最新的10個(gè)登錄用戶,每進(jìn)來(lái)一個(gè)新數(shù)據(jù)就刪除一個(gè)舊數(shù)據(jù),每次就可以從鏈表中直接獲得需要的資源,極大節(jié)省各方面的資源。

3、redis的list還能緩存一些不經(jīng)常修改的系統(tǒng)配置信息。

如緩存地址信息(國(guó)家、省份、城市、街道)、緩存用戶信息等等。


三、常用操作:

1、lpush(left push)方法:

LPUSH key value [value ...]

將一個(gè)或多個(gè)值value插入到列表key的表頭。

如果有多個(gè)value值,那么各個(gè)value值按從左到右的順序依次插入到表頭:比如對(duì)一個(gè)空列表(mylist)執(zhí)行LPUSH mylist a b c,則結(jié)果列表為c b a,

等同于執(zhí)行命令

LPUSH mylist a

LPUSH mylist b

LPUSH mylist c

如果key不存在,一個(gè)空列表會(huì)被創(chuàng)建并執(zhí)行LPUSH操作。

當(dāng)key存在但不是列表類型時(shí),返回一個(gè)錯(cuò)誤。


例如:
# 加入單個(gè)元素

redis> LPUSH languages python
(integer) 1

# 加入重復(fù)元素

redis> LPUSH languages python
(integer) 2

redis> LRANGE languages 0 -1 # 列表允許重復(fù)元素
1) "python"
2) "python"

# 加入多個(gè)元素

redis> LPUSH mylist a b c
(integer) 3

redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"

2、lpushx(left pushx)方法:

LPUSHX key value

將值value插入到列表key的表頭,當(dāng)且僅當(dāng)key存在并且是一個(gè)列表。

和LPUSH命令相反,當(dāng)key不存在時(shí),LPUSHX命令什么也不做。

例如:
# 情況1:對(duì)空列表執(zhí)行LPUSHX

redis> LLEN greet    # greet是一個(gè)空列表
(integer) 0

redis> LPUSHX greet "hello"  # 嘗試LPUSHX,失敗,因?yàn)榱斜頌榭?(integer) 0


# 情況2:對(duì)非空列表執(zhí)行LPUSHX

redis> LPUSH greet "hello"   # 先用LPUSH創(chuàng)建一個(gè)有一個(gè)元素的列表
(integer) 1

redis> LPUSHX greet "good morning"   # 這次LPUSHX執(zhí)行成功
(integer) 2

redis> LRANGE greet 0 -1
1) "good morning"
2) "hello"

3、rpush(right push)方法:

RPUSH key value [value ...]

將一個(gè)或多個(gè)值value插入到列表key的表尾。

如果有多個(gè)value值,那么各個(gè)value值按從左到右的順序依次插入到表尾:

比如對(duì)一個(gè)空列表(mylist)執(zhí)行RPUSH mylist a b c,則結(jié)果列表為a b c,

等同于執(zhí)行命令

RPUSH mylist a、

RPUSH mylist b、

RPUSH mylist c。

如果key不存在,一個(gè)空列表會(huì)被創(chuàng)建并執(zhí)行RPUSH操作。

當(dāng)key存在但不是列表類型時(shí),返回一個(gè)錯(cuò)誤。


備注:在Redis 2.4版本以前的RPUSH命令,都只接受單個(gè)value值。

# 添加單個(gè)元素

redis> RPUSH languages c
(integer) 1

# 添加重復(fù)元素

redis> RPUSH languages c
(integer) 2

redis> LRANGE languages 0 -1 # 列表允許重復(fù)元素
1) "c"
2) "c"

# 添加多個(gè)元素

redis> RPUSH mylist a b c
(integer) 3

redis> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "c"

4、rpushx(right pushx)方法:

RPUSHX key value

將值value插入到列表key的表尾,當(dāng)且僅當(dāng)key存在并且是一個(gè)列表。

和RPUSH命令相反,當(dāng)key不存在時(shí),RPUSHX命令什么也不做。


例如:
# 情況1:key不存在

redis> LLEN greet
(integer) 0

redis> RPUSHX greet "hello"  # 對(duì)不存在的key進(jìn)行RPUSHX,PUSH失敗。
(integer) 0


# 情況2:key存在且是一個(gè)非空列表

redis> RPUSH greet "hi"  # 先用RPUSH插入一個(gè)元素
(integer) 1

redis> RPUSHX greet "hello"  # greet現(xiàn)在是一個(gè)列表類型,RPUSHX操作成功。
(integer) 2

redis> LRANGE greet 0 -1
1) "hi"
2) "hello"

5、lpop(left pop)方法:

LPOP key

移除并返回列表key的頭元素。

redis> LLEN course
(integer) 0

redis> RPUSH course algorithm001
(integer) 1
redis> RPUSH course c++101
(integer) 2

redis> LPOP course  # 移除頭元素
"algorithm001"

6、rpop(right pop)方法:

RPOP key

移除并返回列表key的尾元素。

redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3

redis> RPOP mylist  # 返回被彈出的元素
"three"

redis> LRANGE mylist 0 -1   # 列表剩下的元素
1) "one"
2) "two"

7、llen方法:

LLEN key

返回列表key的長(zhǎng)度。

如果key不存在,則key被解釋為一個(gè)空列表,返回0.

如果key不是列表類型,返回一個(gè)錯(cuò)誤。

# 情況1:空列表

redis> LLEN job
(integer) 0

# 情況2:非空列表
redis> LPUSH job "cook food"
(integer) 1
redis> LPUSH job "have lunch"
(integer) 2

redis> LLEN job
(integer) 2

8、lrange方法:

LRANGE key start end

返回列表key中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量start和end指定。

下標(biāo)(index)參數(shù)start和end都以0為底,也就是說(shuō),以0表示列表的第一個(gè)元素,以1表示列表的第二個(gè)元素,以此類推。

你也可以使用負(fù)數(shù)下標(biāo),以-1表示列表的最后一個(gè)元素,-2表示列表的倒數(shù)第二個(gè)元素,以此類推。

超出范圍的下標(biāo)

超出范圍的下標(biāo)值不會(huì)引起錯(cuò)誤。

如果start下標(biāo)比列表的最大下標(biāo)end(LLEN list減去1)還要大,或者start > stop,LRANGE返回一個(gè)空列表。

如果stop下標(biāo)比end下標(biāo)還要大,Redis將stop的值設(shè)置為end


redis> RPUSH fp-language lisp   # 插入一個(gè)值到列表fp-language
(integer) 1
redis> LRANGE fp-language 0 0
1) "lisp"

redis> RPUSH fp-language scheme
(integer) 2
redis> LRANGE fp-language 0 1
1) "lisp"
2) "scheme"

9、linsert方法:

LINSERT key BEFORE|AFTER pivot value

將值value插入到列表key當(dāng)中,位于值pivot之前或之后。

當(dāng)pivot不存在于列表key時(shí),不執(zhí)行任何操作。

當(dāng)key不存在時(shí),key被視為空列表,不執(zhí)行任何操作。

如果key不是列表類型,返回一個(gè)錯(cuò)誤。

redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2

redis> LINSERT mylist BEFORE "World" "There"
(integer) 3

redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

redis> LINSERT mylist BEFORE "go" "let's"    # 對(duì)一個(gè)非空列表插入,查找一個(gè)不存在的pivot
(integer) -1    # 失敗

redis> EXISTS fake_list  # 對(duì)一個(gè)空列表執(zhí)行LINSERT命令
(integer) 0

redis> LINSERT fake_list BEFORE "nono" "gogogog"
(integer) 0 # 失敗

10、lset方法:

LSET key index value

將列表key下標(biāo)為index的元素的值替換為value。

更多信息請(qǐng)參考LINDEX操作。

當(dāng)index參數(shù)超出范圍,或?qū)σ粋€(gè)空列表(key不存在)進(jìn)行LSET時(shí),返回一個(gè)錯(cuò)誤。

# 情況1:對(duì)空列表(key不存在)進(jìn)行LSET

redis> EXISTS list
(integer) 0

redis> LSET list 0 item
(error) ERR no such key


# 情況2:對(duì)非空列表進(jìn)行LSET

redis> LPUSH job "cook food"
(integer) 1

redis> LRANGE job 0 0
1) "cook food"

redis> LSET job 0 "play game"
OK

redis> LRANGE job  0 0
1) "play game"


# 情況3:index超出范圍

redis> LLEN list # 列表長(zhǎng)度為1
(integer) 1

redis> LSET list 3 'out of range'
(error) ERR index out of range

11、lrem方法:

LREM key count value

根據(jù)參數(shù)count的值,移除列表中與參數(shù)value相等的元素。

count的值可以是以下幾種:

count > 0: 從表頭開(kāi)始向表尾搜索,移除與value相等的元素,數(shù)量為count。

count < 0: 從表尾開(kāi)始向表頭搜索,移除與value相等的元素,數(shù)量為count的絕對(duì)值。

count = 0: 移除表中所有與value相等的值。

# 先創(chuàng)建一個(gè)表,內(nèi)容排列是
# morning hello morning helllo morning

redis> LPUSH greet "morning"
(integer) 1
redis> LPUSH greet "hello"
(integer) 2
redis> LPUSH greet "morning"
(integer) 3
redis> LPUSH greet "hello"
(integer) 4
redis> LPUSH greet "morning"
(integer) 5

redis> LRANGE greet 0 4 # 查看所有元素
1) "morning"
2) "hello"
3) "morning"
4) "hello"
5) "morning"

redis> LREM greet 2 morning  # 移除從表頭到表尾,最先發(fā)現(xiàn)的兩個(gè)morning
(integer) 2  # 兩個(gè)元素被移除

redis> LLEN greet   # 還剩3個(gè)元素
(integer) 3

redis> LRANGE greet 0 2
1) "hello"
2) "hello"
3) "morning"

redis> LREM greet -1 morning  # 移除從表尾到表頭,第一個(gè)morning
(integer) 1

redis> LLEN greet
(integer) 2

redis> LRANGE greet 0 1
1) "hello"
2) "hello"

redis> LREM greet 0 hello  # 移除表中所有hello
(integer) 2  # 兩個(gè)hello被移除

redis> LLEN greet
(integer) 0

12、ltrim方法:

LTRIM key start stop

對(duì)一個(gè)列表進(jìn)行修剪(trim),就是說(shuō),讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。

舉個(gè)例子,執(zhí)行命令LTRIM list 0 2,表示只保留列表list的前三個(gè)元素,其余元素全部刪除。

下標(biāo)(index)參數(shù)start和stop都以0為底,也就是說(shuō),以0表示列表的第一個(gè)元素,以1表示列表的第二個(gè)元素,以此類推。

你也可以使用負(fù)數(shù)下標(biāo),以-1表示列表的最后一個(gè)元素,-2表示列表的倒數(shù)第二個(gè)元素,以此類推。

當(dāng)key不是列表類型時(shí),返回一個(gè)錯(cuò)誤。


# 情況1:一般情況下標(biāo)

redis> LRANGE alpha 0 -1 # 建立一個(gè)5元素的列表
1) "h"
2) "e"
3) "l"
4) "l"
5) "o"

redis> LTRIM alpha 1 -1  # 刪除索引為0的元素
OK

redis> LRANGE alpha 0 -1 # "h"被刪除
1) "e"
2) "l"
3) "l"
4) "o"


# 情況2:stop下標(biāo)比元素的最大下標(biāo)要大

redis> LTRIM alpha 1 10086
OK
redis> LRANGE alpha 0 -1
1) "l"
2) "l"
3) "o"


# 情況3:start和stop下標(biāo)都比最大下標(biāo)要大,且start < sotp

redis> LTRIM alpha 10086 200000
OK
redis> LRANGE alpha 0 -1 # 整個(gè)列表被清空,等同于DEL alpha
(empty list or set)


# 情況4:start > stop

redis> LRANGE alpha 0 -1 # 在新建一個(gè)列表
1) "h"
2) "u"
3) "a"
4) "n"
5) "g"
6) "z"

redis> LTRIM alpha 10086 4
OK

redis> LRANGE alpha 0 -1 # 列表同樣被清空
(empty list or set)

13、rpoplpush方法:

RPOPLPUSH source destination

命令RPOPLPUSH在一個(gè)原子時(shí)間內(nèi),執(zhí)行以下兩個(gè)動(dòng)作:

將列表source中的最后一個(gè)元素(尾元素)彈出,并返回給客戶端。

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

舉個(gè)例子,你有兩個(gè)列表source和destination,source列表有元素a, b, c,destination列表有元素x, y, z,執(zhí)行RPOPLPUSH source destination之后,source列表包含元素a, b,destination列表包含元素c, x, y, z ,并且元素c被返回。

如果source不存在,值nil被返回,并且不執(zhí)行其他動(dòng)作。

如果source和destination相同,則列表中的表尾元素被移動(dòng)到表頭,并返回該元素,可以把這種特殊情況視作列表的旋轉(zhuǎn)(rotation)操作。


# 相關(guān)數(shù)據(jù)

redis> RPUSH alpha a
(integer) 1
redis> RPUSH alpha b
(integer) 2
redis> RPUSH alpha c
(integer) 3
redis> RPUSH alpha d
(integer) 4

# 情況1:source和destination不同

redis> LRANGE alpha 0 -1 # 查看所有元素
1) "a"
2) "b"
3) "c"
4) "d"

redis> RPOPLPUSH alpha reciver   # 執(zhí)行一次RPOPLPUSH看看
"d"

redis> LRANGE alpha 0 -1
1) "a"
2) "b"
3) "c"

redis> LRANGE reciver 0 -1
1) "d"

redis> RPOPLPUSH alpha reciver   # 再執(zhí)行一次,確保rpop和lpush的位置正確
"c"

redis> LRANGE alpha 0 -1
1) "a"
2) "b"

redis> LRANGE reciver 0 -1
1) "c"
2) "d"


# 情況2:source和destination相同

redis> RPOPLPUSH alpha alpha
"c"

redis> LRANGE alpha 0 -1 # 原來(lái)的尾元素"c"被放到了頭部
1) "c"
2) "a"
3) "b"

14、lindex方法:

LINDEX key index

返回列表key中,下標(biāo)為index的元素。

下標(biāo)(index)參數(shù)start和stop都以0為底,也就是說(shuō),以0表示列表的第一個(gè)元素,以1表示列表的第二個(gè)元素,以此類推。

你也可以使用負(fù)數(shù)下標(biāo),以-1表示列表的最后一個(gè)元素,-2表示列表的倒數(shù)第二個(gè)元素,以此類推。

如果key不是列表類型,返回一個(gè)錯(cuò)誤。

redis> LPUSH mylist "World"
(integer) 1

redis> LPUSH mylist "Hello"
(integer) 2

redis> LINDEX mylist 0
"Hello"

redis> LINDEX mylist -1
"World"

redis> LINDEX mylist 3  # index不在mylist的區(qū)間范圍內(nèi)
(nil)

當(dāng)前文章:NoSQL----Redis2.4--List
URL網(wǎng)址:http://m.rwnh.cn/article8/psgjop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站制作、網(wǎng)站收錄、網(wǎng)站內(nèi)鏈外貿(mào)網(wǎng)站建設(shè)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
井研县| 桐梓县| 桐乡市| 铁力市| 黄龙县| 中山市| 古交市| 耿马| 敦煌市| 遵义县| 万宁市| 明水县| 尚志市| 洛阳市| 洛扎县| 林甸县| 蚌埠市| 泰来县| 容城县| 横峰县| 塔河县| 大名县| 罗定市| 新闻| 什邡市| 蚌埠市| 紫阳县| 乌海市| 汉中市| 镇雄县| 曲阳县| 台安县| 垦利县| 苍溪县| 防城港市| 张家界市| 梨树县| 敦煌市| 芷江| 宝兴县| 龙南县|