在go语言开发中,与redis进行交互的场景也非常多,所以这里我们也介绍下go语言开发中redis的使用。
这里使用的redis框架主要是:gopkg.in/redis.v4。所以在使用之前记得安装下依赖。下面介绍下详细使用。
一、创建redis客户端及连接池
go语言简单,操作redis的话,创建连接池也非常方便,示例代码如下:
func createRedisClient() *redis.Client {
client := redis.NewClient(&redis.Options{
Addr: "192.168.1.249:6379", //redis地址和端口
Password: "123456", //redis密码
DB: 0, //默认数据库0
PoolSize: 10, //线程池大小
})
pong, err := client.Ping().Result()
if err != nil {
panic(err)
}
fmt.Println(pong)
return client
}最后在main函数里面直接使用即可:
func main() {
client := createRedisClient()
defer client.Close()
}二、操作redis string相关的命令
这里主要是普通的set get,示例代码如下:
/*
*
普通set-value数据
*/
func setValue(key string, value string, expireTime int, client *redis.Client) (result bool) {
err := client.Set(key, value, time.Duration(expireTime)).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
普通get数据,根据key查询数据
*/
func getValue(key string, client *redis.Client) (result any) {
s, err := client.Get(key).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
getset数据,给key设置一个新值,并且返回就值
*/
func getSetValue(key string, newvalue string, client *redis.Client) (result any) {
s, err := client.GetSet(key, newvalue).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
increKey,自增加一
*/
func increKey(key string, client *redis.Client) (result any) {
incr := client.Incr(key)
return incr
}
/*
*
decreKey,自增加一
*/
func decreKey(key string, client *redis.Client) (result any) {
decr := client.Decr(key)
return decr
}
/*
*
setNX 如果key不存在,则设置这个key的值
*/
func setNX(key string, value string, expirTime int, client *redis.Client) (result bool) {
err := client.SetNX(key, value, time.Duration(expirTime)).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
批量一次获取多个key的值
*/
func getMgetValue(client *redis.Client, keys ...string) (result any) {
s, err := client.MGet(keys...).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
批量设置key-value
*/
func mSetValue(keys map[string]interface{}, client *redis.Client) (result bool) {
err := client.MSet(keys).Err()
if err != nil {
panic(err)
}
return true
}三、操作redis hash相关的命令
操作hash主要是操作对象,示例代码如下:
/*
*
hash 向某个hash中添加字段和值
*/
func hashSet(key string, field string, value string, client *redis.Client) (result bool) {
err := client.HSet(key, field, value).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
hash 向某个hash中map对象
*/
func hashSet(key string, m map[string]string, client *redis.Client) (result bool) {
err := client.HMSet(key, m).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
hash 从某个hash中读取字段和值
*/
func hashGet(key string, field string, client *redis.Client) (result any) {
s, err := client.HGet(key, field).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
hash 获取某个hash中的字段有多少个
*/
func hashLen(key string, client *redis.Client) (result any) {
s, err := client.HLen(key).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
hash 删除某个hash中的某个字段
*/
func hashDel(key string, field string, client *redis.Client) (result any) {
s, err := client.HDel(key, field).Result()
if err != nil {
panic(err)
}
return s
}四、操作redis list相关的命令
list一般用于队列来使用,示例代码如下:
/*
*
lpush list操作左边入队
*/
func lpush(key string, value string, client *redis.Client) (result bool) {
err := client.LPush(key, value).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
rpush list操作右边入队
*/
func rpush(key string, value string, client *redis.Client) (result bool) {
err := client.RPush(key, value).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
lpop list操作左边出队
*/
func lpop(key string, client *redis.Client) (result any) {
s, err := client.LPop(key).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
rpop list操作左边出队
*/
func rpop(key string, client *redis.Client) (result any) {
s, err := client.RPop(key).Result()
if err != nil {
panic(err)
}
return s
}五、操作redis set相关的命令
set主要是集合,数据不能重复,示例代码如下:
/*
*
set操作 sadd添加
*/
func sadd(key string, value string, client *redis.Client) (result bool) {
err := client.SAdd(key, value).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
set操作 srem移除某个元素,不存在的元素会被忽略掉
*/
func srem(key string, value string, client *redis.Client) (result bool) {
err := client.SRem(key, value).Err()
if err != nil {
panic(err)
}
return true
}
/*
*
set操作 获取指定集合的所有元素
*/
func smembers(key string, client *redis.Client) (result []string) {
s, err := client.SMembers(key).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
set操作 获取两个set集合的交集
*/
func sintersection(key1 string, key2 string, client *redis.Client) (result any) {
s, err := client.SInter(key1, key2).Result()
if err != nil {
panic(err)
}
return s
}
/*
*
set操作 判断某个元素是否在set集合中
*/
func sIsMem(key string, value string, client *redis.Client) (result any) {
s, err := client.SIsMember(key, value).Result()
if err != nil {
panic(err)
}
return s
}六、操作redis sorted set相关的命令
带有排序性质的集合,示例代码如下:
/* * sorted set,使用zadd添加一个元素到集合,如果元素已经存在,则更新分数。 */ func sortedsetZadd(key string, value string, score float64, client *redis.Client) (result bool) { err := client.ZAddCh(key, redis.Z{Score: score, Member: value}).Err() if err != nil { panic(err) } return true } /* * sorted set 移除某个元素 */ func sortedsetZrem(key string, value string, client *redis.Client) (result bool) { err := client.ZRem(key, value).Err() if err != nil { panic(err) } return true } /* * sorted set 查询集合中元素个数 */ func sortedsetZcard(key string, client *redis.Client) (result bool) { err := client.ZCard(key).Err() if err != nil { panic(err) } return true } /* * sorted set查询某个元素对应的分数 */ func sortedsetZscore(key string, value string, client *redis.Client) (result any) { f, err := client.ZScore(key, value).Result() if err != nil { panic(err) } return f } /* * sorted set查询某个元素对应的分数 */ func sortedsetZCount(key string, score1 string, score2 string, client *redis.Client) (result any) { f, err := client.ZCount(key, score1, score2).Result() if err != nil { panic(err) } return f } /* * sorted set,根据分数范围查询集合元素,从小到大排序,支持分页,这里仅返回元素不返回分数 */ func sortedsetZRangeByScore(key string, score1 string, score2 string, size int64, client *redis.Client) (result any) { op := redis.ZRangeBy{ Min: score1, Max: score2, Offset: 0, Count: size, } f, err := client.ZRangeByScore(key, op).Result() if err != nil { panic(err) } return f } /* * sorted set,根据分数范围查询集合元素,从大到小排序,支持分页,这里仅返回元素不返回分数 */ func sortedsetZRevRangeByScore(key string, score1 string, score2 string, size int64, client *redis.Client) (result any) { op := redis.ZRangeBy{ Min: score1, Max: score2, Offset: 0, Count: size, } f, err := client.ZRevRangeByScore(key, op).Result() if err != nil { panic(err) } return f } /* * sorted set,根据分数范围查询集合元素,这里既返回元素也返回分数 */ func sortedsetZRangeByScoreWithScore(key string, score1 string, score2 string, size int64, client *redis.Client) (result any) { op := redis.ZRangeBy{ Min: score1, Max: score2, Offset: 0, Count: size, } f, err := client.ZRangeByScoreWithScores(key, op).Result() if err != nil { panic(err) } return f } /* * sorted set,根据分数范围删除集合元素 */ func sortedsetZRemRangeByScore(key string, score1 string, score2 string, client *redis.Client) (result any) { err := client.ZRemRangeByScore(key, score1, score2).Err() if err != nil { panic(err) } return true } /* * sorted set,根据元素名,查询该元素在整个集合中的排名,从0开始,从小到大排序 */ func sortedsetZRank(key string, value string, client *redis.Client) (result any) { s, err := client.ZRank(key, value).Result() if err != nil { panic(err) } return s }
以上就是go语言操作redis常用的一些方法,可以直接应用于实际的代码中做成utils使用。

还没有评论,来说两句吧...