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
#lpushx(name,value)擴充套件:#
rpush(name, values) 表示從右向左操作,往右新增值,也就是後面
conn.rpush('l1',88)
# 在name對應的list中新增元素,只有name已經存在時,值新增到列表的最左邊llen(name)# 更多:
# rpushx(name, value) 表示從右向左操作
# 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插入到第二個位置lrem(name,num,value)——刪除conn.lset('l1',1,'44')
#在name對應的list中刪除指定的值
#引數:
#name,redis的name
#num, num=0,刪除列表中所有的指定值;
#num=2,從前到後,刪除2個;
#num=-2,從後向前,刪除2個
# value,要刪除的值
# 注意引數位置,-2,表示刪除最後的2個值lindex(name, index),根據索引位置取值,索引從0開始conn.lrem('l1',-2,11)
在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全部取值,可以通過切片來獲取全部的值blpop(keys, timeout)——如果列表沒有值,就會夯住,可以模擬出生產者消費者模型佇列和棧:可以用redis列表模擬出來# 切片,取到了全部的值
# print(conn.lrange('l1',0,conn.llen('l1')))
# 前閉後閉區間,取2個值
print(conn.lrange('l1',0,1))
佇列:先進先出棧:後進先出
爬蟲實現簡單分布式:多個url放到列表裡,往裡不停放url,程式迴圈取值,但是只能一台機器執行取值,可以把url放到redis中,多台機器從redis中取值,爬取資料,實現簡單分布式
# 將多個列表排列,按照從左到右去pop對應列表的元素# 引數:
# keys,redis的name的集合
# timeout,超時時間,當元素所有列表的元素獲取完之後,阻塞等待列表內有資料的時間(秒), 0 表示永遠阻塞
# 更多:
# r.brpop(keys, timeout),從右向左獲取資料
爬蟲實現簡單分布式:多個url放到列表裡,往裡不停放url,程式迴圈取值,但是只能一台機器執行取值,可以把url放到redis中,多台機器從redis中取值,爬取資料,實現簡單分布式
# 重點:blpop 如果列表中沒有值,會一直hang住停在那裡,可以實現簡單的分布式爬蟲lpop(name)刪除——刪的同時,把值返回# 使用場景:爬蟲可以把要爬的鏈結放在redis列表裡面,再用乙個程式從redis列表裡面取,取連線去爬,存到資料庫
# 就是乙個程式redis放著許多的連線,另乙個程式從redis裡面取鏈結爬
print(conn.blpop('l1',timeout=3))
# 在name對應的列表的左側獲取第乙個元素並在列表中移除,返回值則是第乙個元素rpoplpush(src, dst)# 更多:
# rpop(name) 表示從右向左操作
# 從乙個列表取出最右邊的元素,同時將其新增至另乙個列表的最左邊brpoplpush(src, dst, timeout=0)# 引數:
# src,要取資料的列表的name
# dst,要新增資料的列表的name
# 從乙個列表的右側移除乙個元素並將其新增到另乙個列表的左側自定義增量迭代# 引數:
# src,取出並要移除元素的列表對應的name
# dst,要插入元素的列表對應的name
# timeout,當src對應的列表中沒有資料時,阻塞等待其有資料的超時時間(秒),0 表示永遠阻塞
#llen(name)——返回列表的長度由於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)
# 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中可以包...