读写缓存是在自动化测试中不可缺少的步骤,以我项目中的读写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版权协议,转载请附上原文出处链接和本声明。