【Redis】redis基本數據結構之List


我的個人博客: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()
}

運行:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM