前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis API——Set功能实践与性能测试【Go版】

Redis API——Set功能实践与性能测试【Go版】

作者头像
FunTester
发布2022-12-09 14:14:07
2530
发布2022-12-09 14:14:07
举报
文章被收录于专栏:FunTesterFunTesterFunTester

之前说要写个 Go 语言版本的 Redis 操作 API 和性能测试的系列,没想到鸽了这么久才写了一半。实在实力不济,不仅需要多充充电,更需要结合实践,劳逸结合。首先来一个前文回顾:

按照惯例,我们先介绍常用的 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.999000
2022/09/18 22:31:29 请求总数: 330634
2022/09/18 22:31:29 QPS: 16532.526626
--- PASS: TestSetPer (20.00s)
PASS
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用 API
    • SAdd
      • SCard
        • SIsMember
          • SMembers
            • SRem
              • SPop & SPopN
              • API 演示用例
              • 性能测试
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档