【Redis】redis基本数据结构之List
我的个⼈博客:
简介:
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/garyburd/redigo/redis
然后编写代码:
package main
import (
"github/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
}
redis五种数据结构fmt.Println("the contrys length is: ", len)
defer c.Close()
}
运⾏:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。