redis 早期版本儲存 list 列表資料結構使用的是壓縮列表 ziplist 和普通的雙向鍊錶 linkedlist,也就是元素少時用 ziplist,元素多時用 linkedlist。
// 鍊錶的節點
struct listnode
// 鍊錶
struct list
考慮到鍊錶的附加空間相對太高,prev 和 next 指標就要占去 16 個位元組 (64bit 系統的指標是 8 個位元組),另外每個節點的記憶體都是單獨分配,會加劇記憶體的碎片化,影響記憶體管理效率。後續版本對列表資料結構進行了改造,使用 quicklist 代替了 ziplist 和 linkedlist。
quicklist 是 ziplist 和 linkedlist 的混合體,它將 linkedlist 按段切分,每一段使用 ziplist 來緊湊儲存,多個 ziplist 之間使用雙向指標串接起來。
struct ziplist
struct ziplist_compressed
struct quicklistnode
struct quicklist
上述**簡單地表示了 quicklist 的大致結構。為了進一步節約空間,redis 還會對 ziplist 進行壓縮儲存,使用 lzf 演算法壓縮,可以選擇壓縮深度。
quicklist 內部預設單個 ziplist 長度為 8k 位元組,超出了這個位元組數,就會新起乙個 ziplist。ziplist 的長度由配置引數list-max-ziplist-size
決定。
quicklist 預設的壓縮深度是 0,也就是不壓縮。壓縮的實際深度由配置引數list-compress-depth
決定。為了支援快速的 push/pop 操作,quicklist 的首尾兩個 ziplist 不壓縮,此時深度就是 1。如果深度為 2,就表示 quicklist 的首尾第乙個 ziplist 以及首尾第二個 ziplist 都不壓縮。
Redis快速入門之列表型別
列表型別內部是使用雙向列表實現的,所以向列表兩端新增資料的時間複雜度為o 1 獲取越接近兩端的資料越快,這意味即使有2000萬的資料從兩端獲取前十條資料,與只有20條獲取的速度是一樣的lpush key value rpush key value lpush 向列表左邊新增元素,返回值為列表的長度 ...
Redis列表命令
1 lpush key value value 向列表左側新增資料 返回新增列表的長度 lpush list a 返回 integer 1 lrange list 0 1 返回 a 2 rpush key value value 向列表右端新增資料 返回新增列表的長度 rpush list b c ...
Redis 列表操作
coding utf 8 import redis 連線池連線 避免每次建立 釋放連線的開銷 pool redis.connectionpool host localhost port 6379 db 0 red redis.redis connection pool pool 在一次請求中指定多個...