redis 操作之List列表操作

2022-09-06 18:54:13 字數 4631 閱讀 7469

redis list操作

reids:
redis 操作之list列表操作

list操作,redis中的list在在記憶體中按照乙個name對應乙個list來儲存。如圖:

lpush(name,values),列表新增值

#

在name對應的list中新增元素,每個新的元素都新增到列表的最左邊,往左新增值,也就是前面#如:

#r.lpush('oo', 11,22,33)

#儲存順序為: 33,22,11

# conn.lpush('l1','11')

conn.lpush('l1','22')

conn.lpush('l1','33') 儲存順序為:33,22,11

#

擴充套件:#

rpush(name, values) 表示從右向左操作,往右新增值,也就是後面

conn.rpush('l1',88)

lpushx(name,value)

# 在name對應的list中新增元素,只有name已經存在時,值新增到列表的最左邊

# 更多:

# rpushx(name, value) 表示從右向左操作

llen(name)

# name對應的list元素的個數
print(conn.llen('l1'))
**linsert(name, where, refvalue, value))

#

在name對應的列表的某乙個值前或後插入乙個新值

#引數:

#name,redis的name

#where,before或after(小寫也可以)

#refvalue,標桿值,即:在它前後插入資料(如果存在多個標桿值,以找到的第乙個為準)

#value,要插入的資料

在12前面插乙個值

conn.linsert('l1','before',22,777)
lset(name, index, value)

#

對name對應的list中的某乙個索引位置重新賦值

#引數:

#name,redis的name

#index,list的索引位置

#value,要設定的值

# 索引從0開始,把44插入到第二個位置

conn.lset('l1',1,'44')

lrem(name,num,value)——刪除

#

在name對應的list中刪除指定的值

#引數:

#name,redis的name

#num, num=0,刪除列表中所有的指定值;

#num=2,從前到後,刪除2個;

#num=-2,從後向前,刪除2個

# value,要刪除的值
# 注意引數位置,-2,表示刪除最後的2個值

conn.lrem('l1',-2,11)

lindex(name, index),根據索引位置取值,索引從0開始

在name對應的列表中根據索引獲取列表元素
print(conn.lindex('l1',5))
lrange(name, start, end)——切片操作

# ****列表操作,沒有getall全部取值,可以通過切片lrange來獲取全部的值

# 切片

#

在name對應的列表分片獲取資料

#引數:

#name,redis的name

#start,索引的起始位置

#end,索引結束位置 print(re.lrange('aa',0,re.llen('aa')))

# ****列表操作,沒有getall全部取值,可以通過切片來獲取全部的值

# 切片,取到了全部的值

# print(conn.lrange('l1',0,conn.llen('l1')))

# 前閉後閉區間,取2個值

print(conn.lrange('l1',0,1))

blpop(keys, timeout)——如果列表沒有值,就會夯住,可以模擬出生產者消費者模型佇列和棧:可以用redis列表模擬出來

佇列:先進先出

棧:後進先出

爬蟲實現簡單分布式:多個url放到列表裡,往裡不停放url,程式迴圈取值,但是只能一台機器執行取值,可以把url放到redis中,多台機器從redis中取值,爬取資料,實現簡單分布式

# 將多個列表排列,按照從左到右去pop對應列表的元素

# 引數:

# keys,redis的name的集合

# timeout,超時時間,當元素所有列表的元素獲取完之後,阻塞等待列表內有資料的時間(秒), 0 表示永遠阻塞

# 更多:

# r.brpop(keys, timeout),從右向左獲取資料

爬蟲實現簡單分布式:多個url放到列表裡,往裡不停放url,程式迴圈取值,但是只能一台機器執行取值,可以把url放到redis中,多台機器從redis中取值,爬取資料,實現簡單分布式

# 重點:blpop 如果列表中沒有值,會一直hang住停在那裡,可以實現簡單的分布式爬蟲

# 使用場景:爬蟲可以把要爬的鏈結放在redis列表裡面,再用乙個程式從redis列表裡面取,取連線去爬,存到資料庫

# 就是乙個程式redis放著許多的連線,另乙個程式從redis裡面取鏈結爬

print(conn.blpop('l1',timeout=3))

lpop(name)刪除——刪的同時,把值返回

# 在name對應的列表的左側獲取第乙個元素並在列表中移除,返回值則是第乙個元素

# 更多:

# rpop(name) 表示從右向左操作

rpoplpush(src, dst)

# 從乙個列表取出最右邊的元素,同時將其新增至另乙個列表的最左邊

# 引數:

# src,要取資料的列表的name

# dst,要新增資料的列表的name

brpoplpush(src, dst, timeout=0)

# 從乙個列表的右側移除乙個元素並將其新增到另乙個列表的左側

# 引數:

# src,取出並要移除元素的列表對應的name

# dst,要插入元素的列表對應的name

# timeout,當src對應的列表中沒有資料時,阻塞等待其有資料的超時時間(秒),0 表示永遠阻塞

自定義增量迭代

#

由於redis類庫中沒有提供對列表元素的增量迭代,如果想要迴圈name對應的列表的所有元素,那麼就需要:

#1、獲取name對應的所有列表

#2、迴圈列表

#但是,如果列表非常大,那麼就有可能在第一步時就將程式的內容撐爆,所有有必要自定義乙個增量迭代的功能:

import

redis

conn=redis.redis(host='

127.0.0.1

',port=6379)

#conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])

#conn.flushall()

def scan_list(name,count=2):

index=0

while

true:

data_list=conn.lrange(name,index,count+index-1)

ifnot

data_list:

return

index+=count

for item in

data_list:

yield

item

print(conn.lrange('

test

',0,100))

for item in scan_list('

test

',5):

print('

---'

)

print(item)

llen(name)——返回列表的長度

# name對應的list元素的個數

Redis 列表List操作

list 就是在同乙個key value中儲存多個value值,是乙個雙向鍊錶 1.從左推入 乙個或者多個value lpush key value1 value2 value3.2.從右推入乙個或多個value rpush key value1 value2 value3.3.從左移除並返回val...

Redis基本操作 List列表

模擬案例 基於linked list實現 元素是字串型別 列表頭尾增刪快,中間增刪慢。增刪元素是常態 最多包含2 31 1個元素 列表索引,從左到右從0開始,從右到左是從 1開始 b block塊,阻塞 l left左 r right 右 x exist存在 lpush key value valu...

Redis之List 列表型別

在redis中,list型別是按照插入順序排序的字串鍊錶。和資料結構中的普通鍊錶一樣,我們可以在其頭部 left 和尾部 right 新增新的元素。在插入時,如果該鍵並不存在,redis將為該鍵建立乙個新的鍊錶。與此相反,如果鍊錶中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。list中可以包...