go-redis使用之List列表

go-redis List列表操作

->go-redis String字符串操作详解
->go-redis Hash哈希操作详解
->go-redis Set集合操作详解
->go-redis ZSet有序集合操作详解

基本的数据类型:List 列表

在redis里,可以把list作为栈、队列、阻塞队列

在redis里,所有的list命令都是l开头的~

func GetRedisClient()*redis.Client{
	return redis.NewClient(&redis.Options{
		Addr:               "localhost:6379",
		Password:           "",
		DB:                 0,
	})
}

// redisListTest List(列表操作)
func redisListTest(cli *redis.Client) {
	cli.FlushDB()
	// 将一条数据添加到列表的头部(类似入栈)
	cli.LPush("mylist","val1")
	// 将一条或多条数据添加到列表的尾部
	cli.RPush("mylist","val99","val100")
	s1:=[]string{"val2","val3","val4"}
	// 将一个切片添加到列表的头部
	cli.LPush("mylist",s1)

	// 获取List的长度
	fmt.Println(cli.LLen("mylist").Val())	//6

	// 获取List中的元素:起始索引~结束索引,当结束索引 > llen(list)或=-1时,取出全部数据
	// 遍历List,获取每一个元素
	// 注意取出来的顺序!!!
	// 注意取出来的顺序!!!
	// 注意取出来的顺序!!!
	s2:=cli.LRange("mylist",0,-1).Val()
	for _, i := range s2 {
		fmt.Println(i)	// [val5 val4 val3 val2 val1 val99 val100]
	}
	fmt.Println(cli.LRange("mylist",0,3).Val())	// [val4 val3 val2 val1]
	fmt.Println(cli.LRange("mylist",0,100).Val())// [val4 val3 val2 val1 val99 val100]

	// 移除List的第一个元素(头元素)
	cli.LPop("mylist")
	fmt.Println(cli.LRange("mylist",0,-1).Val())// [val3 val2 val1 val99 val100]

	// 移除List的最后一个元素(尾元素)
	cli.RPop("mylist")
	fmt.Println(cli.LRange("mylist",0,-1).Val())// [val3 val2 val1 val99]

	// 移除List 指定个数的指定值
	cli.LPush("mylist","val3","val3","val3","val2")
	fmt.Println(cli.LRange("mylist",0,-1).Val())
	fmt.Println(cli.LLen("mylist"))	//llen mylist: 8
	// 此时的mylist: [val2 val3 val3 val3 val3 val2 val1 val99]
	//移除list中的1个val3
	cli.LRem("mylist",1,"val3")
	fmt.Println(cli.LRange("mylist",0,-1).Val())// [val2 val3 val3 val3 val2 val1 val99]
	// 移除剩下的3个值:val3(当移除的个数count大于该值的实际个数时,全部移除)
	cli.LRem("mylist",100,"val3")
	fmt.Println(cli.LRange("mylist",0,-1).Val())// [val2 val2 val1 val99]

	//截取List(通过下标,前闭后闭,会修改原数据)
	cli.LTrim("mylist",1,2)
	fmt.Println(cli.LRange("mylist",0,-1).Val())	// [val2 val1]
	// 截取的结束下标大于List长度或者-1时,一直截取到末尾
	cli.LTrim("mylist",1,100)
	fmt.Println(cli.LRange("mylist",0,-1).Val())	// [val1]

	cli.RPush("mylist","val2","val3")
	//检查数据库是否存在此List,1:存在 0:不存在
	fmt.Println(cli.Exists("mylist2").Val())	// 0
	//移除List的最后一个元素,并移动到另一个列表(若没有此列表则创建)
	cli.RPopLPush("mylist","mylist2")
	fmt.Printf("mylist=%v\n",cli.LRange("mylist",0,-1).Val())	// mylist=[val1 val2]
	fmt.Printf("mylist2=%v\n",cli.LRange("mylist2",0,-1).Val())	// mylist2=[val3]

	// 通过下标更新List的值
	cli.LSet("mylist",1,"val200")
	fmt.Println(cli.LRange("mylist",0,-1).Val())	//[val1 val200]
	// 更新的下标>List的长度会触发panic
	//err:=cli.LSet("mylist",2,"val3").Err()
	//if err != nil {
	//	panic(err)	// panic: ERR index out of range
	//}
	//	当前List不存在,会触发panic
	//err:=cli.LSet("mylist3",1,"qqqqq").Err()
	//if err != nil {
	//	panic(err)	// panic: ERR no such key
	//}

	// 在列表指定的值之前或者之后插入值
	cli.LInsertBefore("mylist","val1","qqq")
	fmt.Println(cli.LRange("mylist",0,-1).Val())	// [qqq val1 val200]
	cli.LInsertAfter("mylist","qqq","hello~")
	fmt.Println(cli.LRange("mylist",0,-1).Val())	// [qqq hello~ val1 val200]
	// 当标志位不存在时,插入值失败
	cli.LInsertAfter("mylist","GOGO","golang").Err()
	fmt.Println(cli.LRange("mylist",0,-1).Val())	// [qqq hello~ val1 val200]

	// 当删除链表内的所有值时,空链表也就不存在了
	for cli.LLen("mylist").Val()>0{
		cli.LPop("mylist")
		fmt.Println(cli.LRange("mylist",0,-1).Val())
	}

	// 查看当前数据库所有key
	fmt.Println(cli.Keys("*").Val())	// [mylist2]
}

func main(){
	rdb:=GetRedisClient()
	defer rdb.Close()
	pong:=rdb.Ping().Val()
	fmt.Printf("数据连接状态:%v\n",pong)	// 数据连接状态:PONG

	// redisStringTest(rdb)

	redisListTest(rdb)
}

小结

  • List实际上是一个链表,可以在节点前后都可以插入值

  • 如果list不存在,创建新的链表

  • 如果list存在,新增内容

  • 如果删除所有的值,空链表,也代表不存在

  • 在两边插入或者改动值效率最高,操作中间元素效率会低

你可能感兴趣的:(go-redis,数据库,redis,golang,java,python)