golang 连接redis

读写缓存是在自动化测试中不可缺少的步骤,以我项目中的读写redis为例,总结下常用的操作

连接:

func openRdb() redis.Conn {
	c, err := redis.Dial("tcp", "××××××××××aliyuncs.com:6379")//network和数据库ip
	
	if err != nil {
		fmt.Println(err)
		return c
	}
	err = c.Send("auth", "password")//send发送密码连接
	if err != nil {
		fmt.Println(err)
	}
	return c
}
注:若有密码,用Send()方法,这里最好将连接返回给调用方

增删改查:

	func work(){
		rds := openRdb()//获取连接
		defer rds.Close()//关闭
		//删除缓存池
		rds.Do("DEL", "api_launcher_set_iflyos_id_assign_list")
		rds.Do("DEL", "api_launcher_set_iflyos_id_assign_reset_list")
		//重构ID池
		for _, iManagement := range iManagements {
			rds.Do("SADD", "api_launcher_set_iflyos_id_assign_list", iManagement.IflyOSDevID)
		}
	
		// 删除缓存
		keys := "*iflyos_device_management_info*"
		raw, err := rds.Do("keys", keys)
		cacheKeys, err := redis.Strings(raw, err)
		//fmt.Println(cacheKeys)
		for _, cacheKey := range cacheKeys {
			rds.Do("DEL", cacheKey)
		}
	}
package request

import (
    "fmt"
	"encoding/json"
    "github.com/garyburd/redigo/redis"
)
var pool *redis.Pool

type mem struct{
	Member string
}

func init() {
    pool = &redis.Pool{
        MaxIdle:     8,
        MaxActive:   0,
        IdleTimeout: 100,
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", "10.00.00.00:6379")
        },
    }
}

func getconnect() redis.Conn{
	conn := pool.Get()
	return conn
}

func closeconn(conn redis.Conn) {
	conn.Close()
}

type  Device struct{
	Mac string	`redis:"mac"`
	Sn string	`redis:"sn"`
	Model string	`redis:"model"`
}

func Sethash(name string ,temp map[string]string) bool{
	conn :=getconnect()
	for k,v:=range(temp){
		_, err1 := conn.Do("HMSet", name, k,v)
		if err1 != nil {
			fmt.Println("HMSet err=", err1)
			return false
		}
	}
	closeconn(conn)
	return true
}

func Gethashtomap(key string)map[string]string  {
	conn :=getconnect()
	myhash, err := redis.StringMap(conn.Do("HGETALL", key))
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(myhash)

	closeconn(conn)
	return myhash
}

func Gethashtostruce(key string) Device  {
	conn :=getconnect()
	device := Device{}
	////values获取的是interface{}
	myhash, err :=redis.Values(conn.Do("HGETALL", key))
	if err != nil {
		fmt.Println(err)
	}
	////一次性扫描interface{}到struct
	if err := redis.ScanStruct(myhash, &device); err != nil {
		fmt.Println(err)
	}
    
	fmt.Printf("%#v\n" ,device)
	closeconn(conn)
	return device
}


func Addtozset(name string,mylist []string) []string{
	conn :=getconnect()
	for k,v:= range(mylist){
		_, err1 := conn.Do("ZADD", name, k,v)
		if err1 !=nil{
			fmt.Println(err1)
		}
	}
	myzset, err := redis.ByteSlices(conn.Do("zrange", name,0,10))
	if err != nil {
		fmt.Println(err)
	}
	zset :=[]string{}
	for _,v:=range(myzset){
		zset = append(zset,string(v))
	}
	fmt.Println(zset)
	return zset
}

func Getcode(mobile string) string{
	conn :=getconnect()
	member :=mem{}
	// mykey:= "xc_srv_passport_string_smscode_"+mobile+"resetpwd"
	code, err := redis.String(conn.Do("GET", mobile))
	if err != nil {
		fmt.Println("redis get failed:", err)
	} else {
		fmt.Printf("Get mykey: %v \n", code)
	}
	temp:=[]byte(code)
	err1 := json.Unmarshal(temp, &member)
	if err1 != nil {
		fmt.Println("unmashal error:", err1)
	}
	fmt.Println(member)
	return code
}

string方法:


  Set(key, value):给数据库中名称为key的string赋予值value
  get(key):返回数据库中名称为key的string的value
  GetSet(key, value):给名称为key的string赋予上一次的value
  MGet(key1, key2,, key N):返回库中多个string的value
  SetNX(key, value):添加string,名称为key,值为value
  SetXX(key, time, value):向库中添加string,设定过期时间time
  MSet(key N, value N):批量设置多个string的值
  MSetNX(key N, value N):如果所有名称为key i的string都不存在
  Incr(key):名称为key的string增1操作
  Incrby(key, integer):名称为key的string增加integer
  Decr(key):名称为key的string减1操作
  Decrby(key, integer):名称为key的string减少integer
  Append(key, value):名称为key的string的值附加valuesubstr(key, start, end):返回名称为key的string的value的子串

List 方法

  RPush(key, value):在名称为key的list尾添加一个值为value的元素
  LPush(key, value):在名称为key的list头添加一个值为value的 元素
  LLen(key):返回名称为key的list的长度
  LRange(key, start, end):返回名称为key的list中start至end之间的元素
  LTrim(key, start, end):截取名称为key的list
  LIndex(key, index):返回名称为key的list中index位置的元素
  LSet(key, index, value):给名称为key的list中index位置的元素赋值
  LRem(key, count, value):删除count个key的list中值为value的元素
  LPop(key):返回并删除名称为key的list中的首元素
  RPop(key):返回并删除名称为key的list中的尾元素
  BLPop(key1, key2,… key N, timeout):lpop命令的block版本。
  BRPop(key1, key2,… key N, timeout):rpop的block版本。
  RPopLPush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

Hash方法:

 	HSet(key, field, value):向名称为key的hash中添加元素field
  HGet(key, field):返回名称为key的hash中field对应的value
  HMget(key, (fields)):返回名称为key的hash中field i对应的value
  HMset(key, (fields)):向名称为key的hash中添加元素field
  HIncrby(key, field, integer):将名称为key的hash中field的value增加integer
  HExists(key, field):名称为key的hash中是否存在键为field的域
  HDel(key, field):删除名称为key的hash中键为field的域
  HLen(key):返回名称为key的hash中元素个数
  HKeys(key):返回名称为key的hash中所有键
  HVals(key):返回名称为key的hash中所有键对应的value
  HGetall(key):返回名称为key的hash中所有的键(field)及其对应的value
另redis的连接池无需使用方管理,只需在Options结构体中定义好PoolSize即可

版权声明:本文为weixin_41479678原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。