Go-Redis(一)redigo基本操作

Go-Redis(一)redigo基本操作

redis是目前流行的高性能key/value缓存,基本上在各种项目都经常出现,在go中使用的是go-redis/redis包操作redis。

基本使用

安装

go get github.com/garyburd/redigo/redis

连接redis

指定下redis的连接地址和密码即可

// 连接redis
func ConnectRedis()redis.Conn{
	client,err := redis.Dial("tcp","localhost:6379",redis.DialPassword("123456"))
	if err != nil{
		panic(err)
	}
	return client
}

数据结构操作

redigo对于redis的操作类似于指定cli指令,比较直观。

command arg...
string

复习下string结构的基本操作:

set k v // set一对k-v
get k   // 通过k获取对应的v
set k v expire time // 设置带过期时间的k-v
exists k // 是否存在指定key

实例:

// string结构操作
func StringOption(client redis.Conn)  {
	// set k11 v11
	_,err := client.Do("set","k11","v11")
	if err != nil{
		log.Fatal("set字符串失败,",err)
	}
	// get k11
	val,err := client.Do("get","k11")
	if err != nil{
		log.Fatal("get字符串失败",err)
	}
	// 支持类型转换
	strVal,_ := redis.String(val,nil)
	fmt.Println("get k11 = ",strVal)
	client.Do("set","k12","12")
	intVal,_:= redis.Int(client.Do("get","k12"))
	fmt.Println("转换后:",intVal)

	// 带国旗时间的k-v,Ex单位是s  set k v expire time
	_,err1 := client.Do("set","keyWithEx","valueWithEx","EX","5")
	if err1 != nil{
		fmt.Println("带过期时间的key set失败,",err)
	}
	valWithEx,_ := redis.String(client.Do("get","keyWithEx"))
	fmt.Println("获取带过期时间的key,",valWithEx)
	time.Sleep(10 * time.Second) // 模拟过期时间
	valWithEx1,_ := redis.String(client.Do("get","keyWithEx"))
	fmt.Println("获取带过期时间的key,",valWithEx1)

	// 是否存在指定key
	exists,_ := client.Do("exists","k12")
	flag,_:= redis.Int(exists,nil);
	fmt.Println("是否存在指定key,",flag == 1)
}

结果:

在这里插入图片描述

list

列表操作:

lpush list val
lpop list 
rpush list val
rpop list
lrange list start end

实例:


// 列表操作
func ListOption(client redis.Conn)  {
	// del key
	client.Do("del","list1")
	// lpush list val
	client.Do("lpush","list1","l1")
	// rpush list val
	client.Do("rpush","list1","l3")
	// lrange list from end
	list,_ := client.Do("lrange","list1","0","100")
	l,_:= redis.Values(list,nil)
	for _,val := range l{
		fmt.Println(string(val.([]byte)))
	}
}

在这里插入图片描述

其他数据结构的操作也是同样道理,这里就不一一列举
了,主要在于redis的指令

完整代码

package go_redis

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
	"log"
	"time"
)

func TestRedis()  {
	ListOption(ConnectRedis())
}

// 连接redis
func ConnectRedis()redis.Conn{
	client,err := redis.Dial("tcp","localhost:6379",redis.DialPassword("123456"))
	if err != nil{
		panic(err)
	}
	return client
}

// string结构操作
func StringOption(client redis.Conn)  {
	// set k11 v11
	_,err := client.Do("set","k11","v11")
	if err != nil{
		log.Fatal("set字符串失败,",err)
	}
	// get k11
	val,err := client.Do("get","k11")
	if err != nil{
		log.Fatal("get字符串失败",err)
	}
	// 支持类型转换
	strVal,_ := redis.String(val,nil)
	fmt.Println("get k11 = ",strVal)
	client.Do("set","k12","12")
	intVal,_:= redis.Int(client.Do("get","k12"))
	fmt.Println("转换后:",intVal)

	// 带国旗时间的k-v,Ex单位是s  set k v expire time
	_,err1 := client.Do("set","keyWithEx","valueWithEx","EX","5")
	if err1 != nil{
		fmt.Println("带过期时间的key set失败,",err)
	}
	valWithEx,_ := redis.String(client.Do("get","keyWithEx"))
	fmt.Println("获取带过期时间的key,",valWithEx)
	time.Sleep(10 * time.Second) // 模拟过期时间
	valWithEx1,_ := redis.String(client.Do("get","keyWithEx"))
	fmt.Println("获取带过期时间的key,",valWithEx1)

	// 是否存在指定key
	exists,_ := client.Do("exists","k12")
	flag,_:= redis.Int(exists,nil);
	fmt.Println("是否存在指定key,",flag == 1)
}

// 列表操作
func ListOption(client redis.Conn)  {
	// del key
	client.Do("del","list1")
	// lpush list val
	client.Do("lpush","list1","l1")
	// rpush list val
	client.Do("rpush","list1","l3")
	// lrange list from end
	list,_ := client.Do("lrange","list1","0","100")
	l,_:= redis.Values(list,nil)
	for _,val := range l{
		fmt.Println(string(val.([]byte)))
	}
}

总结

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作 Redis 的 GO 语言客户端有很多,比如 go-redisredigo 等。下面是使用 go-redis 客户端对 Redis 中的 Geo 类型进行 CURD 操作的示例代码。 首先,需要先安装 go-redis 包: ``` go get github.com/go-redis/redis/v8 ``` 然后,在代码中导入 go-redis 包: ```go import "github.com/go-redis/redis/v8" ``` 接下来,就可以使用 go-redis 包提供的方法对 Redis 中的 Geo 类型进行 CURD 操作了。 **1. 连接 Redis** ```go func connectRedis() *redis.Client { rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // Redis 密码 DB: 0, // Redis 数据库 }) err := rdb.Ping(ctx).Err() if err != nil { panic(err) } return rdb } ``` **2. 添加地理位置数据** ```go func addGeoData(rdb *redis.Client) { // 添加地理位置数据 err := rdb.GeoAdd(ctx, "cities", &redis.GeoLocation{ Name: "Beijing", Longitude: 116.397128, Latitude: 39.916527, }).Err() if err != nil { panic(err) } } ``` **3. 获取地理位置数据** ```go func getGeoData(rdb *redis.Client) { // 获取地理位置数据 locations, err := rdb.GeoRadius(ctx, "cities", 116.397128, 39.916527, &redis.GeoRadiusQuery{ Radius: 100000, // 距离范围 Unit: "m", // 距离单位 WithGeoHash: true, // 是否返回 GeoHash 值 WithCoord: true, // 是否返回经纬度坐标 WithDist: true, // 是否返回距离 Count: 10, // 返回结果数量 }).Result() if err != nil { panic(err) } for _, location := range locations { fmt.Printf("name: %s, longitude: %f, latitude: %f, distance: %f, geohash: %s\n", location.Name, location.Longitude, location.Latitude, location.Distance, location.GeoHash) } } ``` **4. 删除地理位置数据** ```go func deleteGeoData(rdb *redis.Client) { // 删除地理位置数据 err := rdb.ZRem(ctx, "cities", "Beijing").Err() if err != nil { panic(err) } } ``` 完整示例代码: ```go package main import ( "context" "fmt" "github.com/go-redis/redis/v8" ) var ctx = context.Background() func main() { // 连接 Redis rdb := connectRedis() defer rdb.Close() // 添加地理位置数据 addGeoData(rdb) // 获取地理位置数据 getGeoData(rdb) // 删除地理位置数据 deleteGeoData(rdb) } func connectRedis() *redis.Client { rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // Redis 密码 DB: 0, // Redis 数据库 }) err := rdb.Ping(ctx).Err() if err != nil { panic(err) } return rdb } func addGeoData(rdb *redis.Client) { // 添加地理位置数据 err := rdb.GeoAdd(ctx, "cities", &redis.GeoLocation{ Name: "Beijing", Longitude: 116.397128, Latitude: 39.916527, }).Err() if err != nil { panic(err) } } func getGeoData(rdb *redis.Client) { // 获取地理位置数据 locations, err := rdb.GeoRadius(ctx, "cities", 116.397128, 39.916527, &redis.GeoRadiusQuery{ Radius: 100000, // 距离范围 Unit: "m", // 距离单位 WithGeoHash: true, // 是否返回 GeoHash 值 WithCoord: true, // 是否返回经纬度坐标 WithDist: true, // 是否返回距离 Count: 10, // 返回结果数量 }).Result() if err != nil { panic(err) } for _, location := range locations { fmt.Printf("name: %s, longitude: %f, latitude: %f, distance: %f, geohash: %s\n", location.Name, location.Longitude, location.Latitude, location.Distance, location.GeoHash) } } func deleteGeoData(rdb *redis.Client) { // 删除地理位置数据 err := rdb.ZRem(ctx, "cities", "Beijing").Err() if err != nil { panic(err) } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值