美文网首页
啥?竟然还不清楚Redis里的List和Java里的List的区

啥?竟然还不清楚Redis里的List和Java里的List的区

作者: 猿天下 | 来源:发表于2021-04-27 20:59 被阅读0次

    大家好,我是你们的于小二。

    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。

    image

    当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

    我是终端研发部的小于哥
    @终端研发部
    面试过很多很多应聘者,说实话, 现在面试要求可真高,虽然工作拧螺丝,但面试还是造火箭的。很多东西我们不光要会用,也要懂其原理。在战术上一定要重视,方能百战不殆!如果有帮助,欢迎点赞!

    相关文章

      网友评论

          本文标题:啥?竟然还不清楚Redis里的List和Java里的List的区

          本文链接:https://www.haomeiwen.com/subject/bipyrltx.html