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

运行:

 

posted @ 2019-06-24 00:10  微弦  阅读(4154)  评论(0编辑  收藏  举报