啥?竟然還不清楚Redis裏的List和Java裏的List的區別 簡介: 操作: go代碼連接:

大家好,我是你們的於小二。

redis中有五種數據類型,分別是zset,set,list,hash和string,其實就是和java中那幾種集合差不多。但是你知道嗎,Redis裏的List和Java裏的List其實有很大的差別,這裏小於哥帶你絮叨絮叨。

技術github學習地址:https://github.com/codeGoogler/JavaCodeHub

程序員編程書籍:https://github.com/codeGoogler/ProgramBooks

簡介:

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()
}
 

運行:

作者:微弦
鏈接:https://www.cnblogs.com/wuyizuokan/p/11074919.html
來源:cnblogs

關於如何學習Java,一方面需要不斷的去學習,把基礎知識學紮實,另一方面也要認識到java的學習不能僅僅靠理論,更多的是靠實操,所以要多練習多做項目,在實踐中學習纔是最好的學習方法。很多人剛開始不知道怎麼去學習,這裏我和大部分都來自好朋友整理的一份《JavaCodeHub面試突擊》,裏面包含的內容實在是太全面了,真的很能考察出一名應聘者的成色。

JavaCodeHub

我是終端研發部的小於哥
@終端研發部
面試過很多很多應聘者,說實話, 現在面試要求可真高,雖然工作擰螺絲,但面試還是造火箭的。很多東西我們不光要會用,也要懂其原理。在戰術上一定要重視,方能百戰不殆!如果有幫助,歡迎點贊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章