我的個人博客:https://www.wuyizuokan.com
簡介:
Redis中的List數據結構是鏈表型的,類似於LinkedList。所以它的插入效率非常高,時間復雜度為O(1)。它的查詢效率較慢,時O(n)。
但其實Redis內部,list結構又不是一個簡單的鏈表,因為LinkedList的每一個節點都要保存上一個節點和下一個節點的指針,相對來說比數組型的列表更占空間。在Redis中,有一種壓縮列表的存在zipList,它把少量的元素使用一個連續的內存空間,就像時數組一樣,可以節省內存,而list結構就是由多個這種zipList串起來組成的,被稱為快速鏈表quickList。
當list結構中的最后一個元素被刪除時,這個list也將被redis釋放。
操作:
從頭部加入元素:lpush listName value1
從尾部加入元素:rpush listName value1
獲取所有元素:lrange listName 0 -1 // 注意,需要遍歷列表,慎用。
刪除元素:LREM KEY_NAME COUNT VALUE
COUNT 的值可以是以下幾種:
count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數量為 COUNT 。
count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。
count = 0 : 移除表中所有與 VALUE 相等的值。
清空列表 ltrim listName 1 0:
從list頭部刪除元素,並返回該元素,lpop listName
從list尾部刪除元素,並返回該元素,rpop listName
返回元素個數llen listName:
返回指定下標的元素, lindex listName <lindex> // 會遍歷整個列表,效率不高:
從上面的命令測試中,可以看出list結構支持在兩端添加和刪除元素,其實可以用來實現為隊列(先進先出)和棧(先進后出)的結構:
lpush和rpop 或者rpush和lpop的組合,就是一個隊列的結構:
lpush和lpop或者rpush和rpop組合使用,就是一個棧的數據結構:
go代碼連接:
首先下載golang連接redis的三方庫:
go get github.com/garyburd/redigo/redis
然后編寫代碼:
package main import ( "github.com/garyburd/redigo/redis" "fmt" ) func main(){ // 連接redis c, err := redis.Dial("tcp", "localhost:6379") if err != nil { fmt.Errorf("conn redis failed, error info:", err) return } // lpush _, err = c.Do("lpush", "country", "China") if err != nil { fmt.Errorf("lpush failed. error info: ", err) return } // lpush _, err = c.Do("lpush", "country", "United States") if err != nil { fmt.Errorf("lpush failed error info: ", err) return } // lpush _, err = c.Do("lpush", "country", "Russia") if err != nil { fmt.Errorf("lpush failed error info: ", err) return } // lpop contryName, err1 := redis.String(c.Do("lpop", "country")) if err1 != nil { fmt.Errorf("lpop failed error info: ", err1) return } fmt.Println("the contry name is: ", contryName) // llen len, err2 := c.Do("llen", "country") if err2 != nil { fmt.Errorf("llen failed error info: ", err2) return } fmt.Println("the contrys length is: ", len) defer c.Close() }
運行: