当前位置: 首页 > news >正文

荷塘网站建设广州建设网站方案

荷塘网站建设,广州建设网站方案,中企动力网站策划,长沙如何优化排名在业务开发中,有时需要对某个操作在整个集群中限制并发度,例如限制大模型对话的并行数。基于redis zset实现计数锁,做个笔记。 关键词:并行流量控制、计数锁 package redisutilimport ("context""fmt""m…

在业务开发中,有时需要对某个操作在整个集群中限制并发度,例如限制大模型对话的并行数。基于redis zset实现计数锁,做个笔记。

关键词:并行流量控制、计数锁

package redisutilimport ("context""fmt""math""time""github.com/go-redis/redis/v9"
)// AcquireZSetLock 借助redis zset数据结构实现分布式计数锁。可用于计数任务运行数,防止超限。返回值:zset大小、释放锁的函数、错误信息
func AcquireZSetLock(ctx context.Context, c redis.Client, key string, element string, zsetMaxSize int,expiresIn time.Duration, syncWait time.Duration) (int, func() error, error) {ctx, cancel := context.WithTimeout(ctx, syncWait)defer cancel()for i := 0; ; i++ {select {case <-ctx.Done(): // 接到取消信号,按插入失败处理return -1, func() error { return nil }, ctx.Err()default:}size, err := insertElementToZsetLock(ctx, c, key, element, zsetMaxSize, expiresIn)if err != nil {second := 0.4 + 0.6*math.Exp(-0.17*float64(i)) // f(i=0) = 1.0; f(i=10) = 0.5096,即第10次就会衰减到0.5096秒second = max(second, 0.5)                      // 最小间隔0.5秒,防止过于频繁的请求time.Sleep(time.Duration(second*1000) * time.Millisecond)}releaseFunc := func() error {result, err := c.ZRem(context.Background(), key, element).Result()if err != nil {return fmt.Errorf("redis zrem error: %v. return=%d", err, result)}return nil}return size, releaseFunc, nil}
}// insertElementToZsetLock 插入元素到zset,并删除已过期的元素
func insertElementToZsetLock(ctx context.Context, c redis.Client, key string, element string, zsetMaxSize int, expiresIn time.Duration) (int, error) {luaScript := `local zsetName = KEYS[1]local memberName = ARGV[1]local currentTime = tonumber(ARGV[2])local deadTime = tonumber(ARGV[3])local sizeLimit = tonumber(ARGV[4])-- 删除已过期的元素redis.call("ZREMRANGEBYSCORE", zsetName, "-inf", currentTime)-- 获取集合的大小local setSize = redis.call('ZCard', zsetName)-- 如果集合大小小于限制值,则添加元素,并返回集合大小if setSize < sizeLimit thenredis.call('ZAdd', zsetName, deadTime, memberName)local expireTime = deadTime - currentTimeif expireTime > 0 thenredis.call('EXPIRE', zsetName, expireTime)endreturn setSize+1endreturn -1`currentTime := time.Now().Unix()deadTime := time.Now().Add(expiresIn).Unix() // 过期时间 Unix秒ret, err := c.Do(ctx, "EVAL", luaScript, 1, key, element, currentTime, deadTime, zsetMaxSize).Result()if err != nil {return -1, err}if ret.(int64) < 0 {return zsetMaxSize, fmt.Errorf("zset size reach max size: %d", zsetMaxSize)}return int(ret.(int64)), nil
}

使用示例:

size, release, err := AcquireZSetLock(ctx, client, key, element, 10, 10*time.Second, 3*time.Second)
defer release()
if err != nil {fmt.Println(err)
}
http://www.dtcms.com/a/559934.html

相关文章:

  • asp网站开发实例wordpress文章密码插件
  • 视频网站cms系统河南工程建设信息网官网
  • 松江品划网站建设维护装修公司报价明细表范本
  • wordpress子目录 多站点互联网平台建设方案
  • 网站开发公司 重庆桓台网站开发
  • 网站实名认证功能怎么做房产网站开发用什么语言好
  • 番禺电子商务网站建设网站建设偶像
  • 高端做网站价格建设厅网站业务系统板块查成绩
  • 有注入漏洞的网站源码做视频网站资源采集
  • 网站最重要的是首页吗制作网页链接的步骤
  • 网站建设买阿里云云服务器百姓网交友征婚
  • 佛山网站建设优化长治长治那有做网站的
  • 商务网站建设评估的指标邯郸网页
  • 中国建设银行网站签名通下载安装成品网站
  • 商会网站模板百度指数搜索榜
  • 网站开发专业前景网站建设需求分析班级
  • 郑州手机网站建设多少钱wordpress 媒体库设置
  • wordpress 博主认证公司网站搜索优化
  • 21. 构造二叉树
  • 银川网站建设一条龙服务建设企业网站e路护航官网下载
  • 开票 网站建设做自己的视频网站
  • 软件公司门户网站模板软件开发培训课件
  • 网站建设易网拓品牌建设的步骤
  • 有人做网站花了10几万最新军事新闻12小时
  • 做公众号微网站请解释网站开发的主要流程
  • 哪里有网站推广软件seo营销型网站
  • 使页面具有动态效果的网站建设技术是基础网站怎么做
  • wordpress设置301重定向wordpress织梦seo
  • 高校网站建设前言跨境电商网站系统开发
  • 网站建设申请百度优化服务