大家好,欢迎来到IT知识分享网。
之前说要写个 Go 语言版本的 Redis 操作 API 和性能测试的系列,没想到鸽了这么久才写了一半。实在实力不济,不仅需要多充充电,更需要结合实践,劳逸结合。首先来一个前文回顾:
- Go语言Redis API基本功能实践 2022-06-23
- Redis API——List功能实践与性能测试【Go版】 2022-08-15
按照惯例,我们先介绍常用的 API及其封装,然后写个简单的测试用例,然后再进行性能测试。PS:由于不可描述的原因,本机的磁盘 IO 性能变差,测出的性能参考性较差。
常用 API
由于 set 本身是无序的,所以 set 操作的 API 也是比较简单的。
SAdd
这个 API 功能是向 set 中添加元素,返回的也是新增的,也就是说如果新增的元素有重复的,那么返回值是不会计算这个重复的key。
// SAdd // @Description: 添加集合元素 // @receiver r // @param key // @param members // @return int64 // func (r RedisBase) SAdd(key string, members ...interface{}) int64 { result, err := r.pool.SAdd(key, members...).Result() if err != nil { log.Printf("sadd key:%s,members:%s fail\n", key, ftool.ToString(members)) log.Println(err) return base.TestError } return result }
SCard
SCard 功能是获取 set 中元素个数,返回值是 set 中元素个数。
// SCard // @Description: 获取集合元素个数 // @receiver r // @param key // @return int64 // func (r RedisBase) SCard(key string) int64 { result, err := r.pool.SCard(key).Result() if err != nil { log.Printf("scard key:%s fail\n", key) log.Println(err) return base.TestError } return result }
SIsMember
SIsMember API 功能是判断元素是否存在在当前的 set 中。
// SIsMember // @Description: 判断元素是否在集合中 // @receiver r // @param key // @param member // @return bool // func (r RedisBase) SIsMember(key string, member interface{}) bool { result, err := r.pool.SIsMember(key, member).Result() if err != nil { log.Printf("sismember key:%s,member:%s fail\n", key, ftool.ToString(member)) log.Println(err) return false } return result }
SMembers
SMembers API 功能是获取 set 中所有元素。
// SMembers // @Description: 获取集合中所有的元素 // @receiver r // @param key // @return []string // func (r RedisBase) SMembers(key string) []string { result, err := r.pool.SMembers(key).Result() if err != nil { log.Printf("smember key:%s fail\n", key) log.Println(err) return nil } return result }
SRem
SRem API 功能是删除集合中的元素,同样的返回值也提示删除成功的个数,如果这个元素并不在 set 中,那么返回值不包含这个计数。
// SRem // @Description: 删除集合元素 // @receiver r // @param key // @param members // func (r RedisBase) SRem(key string, members ...interface{}) int64 { result, err := r.pool.SRem(key, members...).Result() if err != nil { log.Printf("srem key:%s members:%s fail\n", key, ftool.ToString(members)) log.Println(err) return base.TestError } return result }
SPop & SPopN
SPop API 是随机获取 set 中的一个元素,并且会删除改元素。 SPopN API 是随机获取 N 个元素,并且删除该元素,如果 N 的值大于当前元素个数,那么有多少返回多少。
// SPop // @Description: 随机返回集合中的元素,并且删除返回的元素 // @receiver r // @param key // @return string // func (r RedisBase) SPop(key string) string { result, err := r.pool.SPop(key).Result() if err != nil { log.Printf("spop key:%s fail\n", key) log.Println(err) return base.Empty } return result }
API 演示用例
这篇文章把用例写到一起了,毕竟都是简单的 API,单独写有点占篇幅。
func TestSet(t *testing.T) { var pool = redis.NewRdisPool("127.0.0.1:6379", base.Empty, 1) var key = "funset" add := pool.SAdd(key, ftool.RandomStr(10), ftool.RandomStr(3), "FunTester") log.Println(add) log.Printf("FunTester 是否存在 %t", pool.SIsMember(key, "FunTester")) log.Println(pool.SCard(key)) members := pool.SMembers(key) for _, s := range members { log.Println(s) if ftool.RandomInt(2) == 1 && s != "FunTester" { pool.SRem(key, s) } } log.Println(pool.SRem(key, "FunTester", "000000000")) log.Println(pool.SPop(key)) log.Println(len(pool.SPopN(key, 1000))) }
性能测试
用例思路:添加一些随机的字符串到 set 中,然后根据成功次数随机从 set 中删除。
func TestSetPer(t *testing.T) { var pool = redis.NewRdisPool("127.0.0.1:6379", base.Empty, 1) var key = "funsetper" execute.ExecuteRoutineTime(func() { add := int(pool.SAdd(key, ftool.RandomStr(10), ftool.RandomStr(3))) for i := 0; i < add; i++ { pool.SPop(key) } }, 20, 5) }
控制台输出:
=== RUN TestSetPer 2022/09/18 22:31:09 Redis 连接成功 2022/09/18 22:31:09 确认连接成功! 2022/09/18 22:31:29 总耗时: 19. 2022/09/18 22:31:29 请求总数: 2022/09/18 22:31:29 QPS: 16532. --- PASS: TestSetPer (20.00s) PASS
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124108.html