博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go 实现简单的加权分配
阅读量:4581 次
发布时间:2019-06-09

本文共 1026 字,大约阅读时间需要 3 分钟。

最近一段时间接手了一个golang编写的模块,从python转到golang这种静态语言还是有些不适应的,接手模块后的第一个需求是实现一个加权分配的方法。

简单来说数据库中存有3个链接,3个链接的权重比是1:2:3,当前端请求链接时,按照权重比,随机返回一个链接。无论那种语言,解决这个问题的思路都基本相同。我的思路是将权重相加,得到权重总和total,然后随机生成一个0~tatal之间的浮点数weight,根据weight在total中的分布对应链接的分布。

数据库Ad,表Adur,字段weight, url, is_del(标记删除),首先从数据库中读出is_del为0的所有数据,并求出weight总和,数据库操作使用go-xorm。

首先定义访问数据库的结构体

type Adurl struct {  ID     uint    `xorm:"autoincr id" json:"id"`  Weight float64 `xorm:"weight" json:"weight"`  Url    string  `xorm:"url" json:"url"`  Isdel  uint    `xorm:"is_del" json:"is_del"`}

开始操作数据库

res := make([]Adurl, 0)sum_res := new(Adurl)db.Adurl.Where("is_del = 0").Find(&res)total, err := db.Adurl.Where("is_del = 0").Sum(sum_res, "weight")if err != nil {  logger.Runtime().Debug(map[string]interface{}{}, "failed to connect database")}

生成随机浮点数weight

weight := rand.Float64() * total

接下来根据weight,遍历查库得到的res,来得出weight对应那个url

for _, a := range res {  if weight <= a.Weight {    return a.Url  } else {    weight -= a.Weight  }}

 

转载于:https://www.cnblogs.com/baiyb/p/8687777.html

你可能感兴趣的文章
Linux 任务计划:crontab
查看>>
JPA用法中字段起名规范
查看>>
http status code
查看>>
input宽度超出
查看>>
java设计模式----工厂方法模式
查看>>
什么是网站CDN服务,CDN加速原理?
查看>>
内存泄漏以及常见的解决方法
查看>>
解决itunesconnect无法訪问
查看>>
Java使用OkHttps工具类调用外部接口
查看>>
Openwebrtc
查看>>
curl获得cookie数据<转>
查看>>
Noise Level CodeForces - 847I
查看>>
Oracle 表的连接方式(2)-----HASH JOIN的基本机制3
查看>>
Chapter 5 Blood Type——3
查看>>
大话图解golang map
查看>>
ubuntu下安装ssh服务器方法
查看>>
Servlet
查看>>
Object的各种方法
查看>>
MFC控件随窗口大小变化原理及实现
查看>>
GetVersionEx 正确获取windows10版本
查看>>