go 实现简单的加权分配详解编程语言
2023-06-13 09:20:37 时间
最近一段时间接手了一个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
12480.html
cgopython相关文章
- Go REFLECT Library | 01 - 反射的类型 Type
- H5小程序+GO服务部署并上线飞书
- 「Go工具箱」一个基于双向链表实现的LRU缓存工具
- 「Go工具箱」一个将非负整数转换成唯一、无序ID的工具:hashids
- Go-Channel的使用和底层原理(下)
- Go语言关键字与标识符简述
- Go语言go mod包依赖管理工具使用详解
- Go实现短url项目详解编程语言
- Go基础之–数组和切片详解编程语言
- Go语言圣经-并发的非阻塞缓存详解编程语言
- Go语言圣经-示例: 并发的目录遍历习题详解编程语言
- Go语言圣经-指针对象的方法-bit数组习题详解编程语言
- Go语言圣经-错误,函数值习题详解编程语言
- Go语言圣经–作用域,基础数据类型,整型详解编程语言
- go语言圣经-声明,变量,赋值,类型,包和文件习题详解编程语言
- Go_笔试题记录-指针与值类型实现接口的区别详解编程语言
- Go语言环境配置:在 Linux 下实现(go环境搭建linux)
- 键入高效数据库搜索:深入解析Go和MongoDB的强大组合(gomongodb)
- Python的四个挑战者:Swift、Go、Julia、R
- 关键字在SQL Server中利用GO关键字实现更优化的操作(sqlserver中go)
- 一步一步学习Go读取Oracle数据库(go读取oracle)
- 数据库Go语言实现监控Oracle数据库(go监听oracle)
- 给Oracle数据库添加专业技能,Go大发展(go_db_oracle)
- 进入新零售,Amazon Go的野心有多大?