->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存在,新增内容
如果删除所有的值,空链表,也代表不存在
在两边插入或者改动值效率最高,操作中间元素效率会低