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存在,新增内容

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

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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Go微服务中使用Redis缓存是一种常见的做法。通过引入动态缓存配置文件和初始化dynamic_cache.go中的公有值,可以实现对Redis缓存的配置和初始化。在配置文件中使用include命令引入动态缓存配置文件(dynamicache.conf),可以更方便地管理和修改缓存配置。在sysinit/sysinit.go文件中,有一个函数initDynamicCache用于初始化dynamic_cache.go中的公有值,并初始化Redis配置。可以通过设置MaxOpen、MaxIdle和ExpireSec等参数来配置Redis缓存的最大连接数、最大空闲连接数和缓存过期时间。通过调用dynamicache.InitCache()方法来初始化Redis缓存。这样就可以在Go微服务中使用go-redis缓存了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [go-redis-cache:使用Redis缓存进行微服务](https://download.csdn.net/download/weixin_42131628/16618478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Go项目优化——动态缓存Redis使用](https://blog.csdn.net/weixin_52000204/article/details/127338089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值