網(wǎng)站如何做監(jiān)測鏈接seo怎么推廣
list 列表
我們總是說List為列表,其實在真正的數(shù)據(jù)結(jié)構(gòu)來說,redis是自己基于c語言來實現(xiàn)的雙向鏈表數(shù)據(jù)結(jié)構(gòu),主要的邏輯就是每個節(jié)點都可以指向下一個節(jié)點,這個結(jié)構(gòu)就屬于鏈表數(shù)組結(jié)構(gòu)。
每個節(jié)點中的屬性如下:
typedef struct listNode {struct listNode * prev; //上一個節(jié)點struct listNode * next; //下一個節(jié)點void * value; //當(dāng)前節(jié)點值
}
本身的List列表也有一個對象,屬性如下:
typedef struct list {listNode * head; //頭部節(jié)點地址listNode * tail; //尾部節(jié)點地址unsigned long len; 長度void *(*dup)(void *ptr);void (*free)(void *ptr);int (*match)(void *ptr, void *key);
}
雙向鏈表,獲取prev和next的時間復(fù)雜度都是O(1),而且不能搞成環(huán),因為頭和尾都是指向NULL的
head和tail指針,可以讓頭和尾的獲取時間復(fù)雜度都是O(1)
len可以獲取鏈表元素個數(shù)的時間復(fù)雜度是O(1),lrange -> 遍歷-> O(n)
支持多態(tài),void*指針保存了value值,元素可以是不同類型的值,dup、free、match可以給節(jié)點值設(shè)置類型特定的函數(shù)
優(yōu)點
即使列表中有數(shù)百萬個元素,在列表頭部或尾部添加新元素的操作也是在恒定時間內(nèi)執(zhí)行的。使用命令將新元素添加到包含十個元素的列表頭部的速度 與 將元素添加到包含一千萬個元素的列表頭部的速度相同。
缺點
在使用數(shù)組實現(xiàn)的列表中,通過索引訪問元素非???#xff08;java中的ArrayList,常量時間索引訪問),而在通過鏈接列表實現(xiàn)的列表中則不那么快(其中操作需要的工作量與所訪問元素的索引成比例)。
如果在業(yè)務(wù)中確實要大量訪問列表中的中間部分元素的話,建議使用有序列表ZSet
使用命令
LPUSH命令在列表的頭部添加一個新元素;RPUSH添加到列表的尾部。
LPOP從列表頭部移除并返回一個元素;RPOP執(zhí)行相同操作,但從列表尾部移除。
LLEN返回列表的長度。
LMOVE原子地將元素從一個列表移動到另一個列表。
LRANGE從列表中提取一定范圍的元素。
LTRIM將列表縮減為指定的元素范圍。
例子
隊列
當(dāng)做隊列使用(先進先出)
LPUSH命令在列表的頭部添加一個新元素;
RPOP命令在尾部彈出一個元素,并移除;
堆棧
將列表視為堆棧(先進后出)
LPUSH命令在列表的頭部添加一個新元素;
LPOP從列表頭部移除并返回一個元素;
淘汰列表
LTRIM命令需要兩個參數(shù)
LTRIM bikes:repairs 0 2
上面這個命令,就是保留列表中的索引0-2范圍內(nèi)的元素,其他元素全部丟棄