本文使用的redis客户端为go-redis
准备步骤
客户端的连接:
导入go-redis包:github.com/go-redis/redis/v8
创建客户端:
client := redis.NewClient(&redis.Options{
Addr: "192.168.7.4:6379",
Password: "",
DB: 0,
})
使用
注解:集合中可以插入任意类型的数值,不需要整个集合为同一种类型。
1.插入数据
注解:在插入数据到时候,如果不存在这个集合,则会先创建一个空的集合,然后再执行插入操作。命令没有强制大写,小写也是可以的。
1.1 RPUSH追加插入
func excute() {
command := "RPUSH"
d, err := client.Do(context.TODO(), command, "words", "A","B").Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:2
注解:使用RPUSH在words集合中以追加的方法添加了A,B两个字符,操作成功后,Result()返回插入个数:2。再由于我是第一次插入数据,所以程序内部默认先帮我创建一个空集合,然后再将AB顺序插入。
1.2 LPUSH头部插入
func excute() {
command := "LPUSH"
d, err := client.Do(context.TODO(), command, "words", "C").Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:3
注解:LPUSH将会把数据插入到下标为0的位置。
2.查找数据
注解:集合的数据查找可以分为两类:1.按下标位置查找 2.区间范围查找。redis集合的下标最小为0,最大为-1,第二大为-2。
2.1 LINDEX下标查找
下标查找的时候,如果对应下标的值不存在或者集合不存在,则返回特殊类型:redis.Nil。
我们上面在worlds中插入了CAB三个值,所以我们查找下标为3将返回redis.Nil:
func excute() {
command := "LINDEX"
d, err := client.Do(context.TODO(), command, "words", 3).Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:empty
查找下标为1,应该是A:
func excute() {
command := "LINDEX"
d, err := client.Do(context.TODO(), command, "words", 1).Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:A
2.2 LRANGE区间范围查找
语法:client.Do(ctx,command,“collectionName”,“startIndex”,“endIndex”)
注解:下标startIndex跟endIndex可以是被双引号括起来的字符串也可以直接是阿拉伯数字,startIndex跟endIndex都为全区间[startIndex,endIndex]。(有效下标最小是0,最大是-1):
func excute() {
command := "LRANGE"
d, err := client.Do(context.TODO(), command, "words", 0, -1).Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:[C A B]
查询区间范围:-100 ~ 100
func excute() {
command := "LRANGE"
d, err := client.Do(context.TODO(), command, "words", -100, 100).Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:[C A B]
注解:真实有效的区间范围是[0,-1],开始下标为负数时,表示从集合最后面往前数。
3.删除数据
注解:redis6.2版本开始可以选择删除数量跟删除区间范围内的数据,6.2以下一次只能删除一个数据。
3.1 LPOP从头部开始删除
集合中数据:[C A B]
func excute() {
command := "LPOP"
d, err := client.Do(context.TODO(), command, "words").Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:C
3.2 RPOP从末尾开始删除
集合中数据:[C A B]
func excute() {
command := "RPOP"
d, err := client.Do(context.TODO(), command, "words").Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:B
4.更新集合中的数据
4.1 LSET更新数据
集合中数据[C A B]
更改下标为0的数据为B:
func excute() {
command := "LSET"
d, err := client.Do(context.TODO(), command, "words", "0", "B").Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:OK
通过LRANGE查看:
func excute() {
command := "LRANGE"
d, err := client.Do(context.TODO(), command, "words", "0", "-1").Result()
if err == redis.Nil {
fmt.Println("empty")
} else if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println("结果:", d)
}
}
结果:[B A B]