Compare commits

..

6 Commits

Author SHA1 Message Date
ayflying
09a9f14a29 修改ExcelTime2Time方法 2025-04-09 11:47:07 +08:00
ayflying
e0afb55bb2 随机算法小修改 2025-04-08 18:43:37 +08:00
ayflying
a469692358 修改随机方法 2025-04-02 16:20:03 +08:00
ayflying
bce7131d9f 开启qps 2025-04-02 15:55:43 +08:00
ayflying
a53f7b718d 修改目录 2025-04-02 15:53:05 +08:00
ayflying
75624ff0b7 使用boot统一注册执行代码 2025-04-02 15:49:42 +08:00
9 changed files with 99 additions and 46 deletions

View File

@@ -1,6 +1,7 @@
package elasticsearch package elasticsearch
import ( import (
"github.com/ayflying/utility_go/internal/boot"
"github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
) )
@@ -14,17 +15,20 @@ const (
quoteChar = "`" quoteChar = "`"
) )
func Init() { func init() {
var ( boot.AddFunc(func() {
err error var (
driverObj = New() err error
driverNames = g.SliceStr{"es", "elasticsearch"} driverObj = New()
) driverNames = g.SliceStr{"es", "elasticsearch"}
for _, driverName := range driverNames { )
if err = gdb.Register(driverName, driverObj); err != nil { for _, driverName := range driverNames {
panic(err) if err = gdb.Register(driverName, driverObj); err != nil {
panic(err)
}
} }
} })
} }
// New create and returns a driver that implements gdb.Driver, which supports operations for MySQL. // New create and returns a driver that implements gdb.Driver, which supports operations for MySQL.

View File

@@ -2,11 +2,8 @@ package boot
import ( import (
v1 "github.com/ayflying/utility_go/api/system/v1" v1 "github.com/ayflying/utility_go/api/system/v1"
"github.com/ayflying/utility_go/drivers/db/elasticsearch"
"github.com/ayflying/utility_go/pkg/aycache"
"github.com/ayflying/utility_go/service" "github.com/ayflying/utility_go/service"
"github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gctx"
"math"
) )
var ( var (
@@ -22,16 +19,6 @@ func Boot() (err error) {
return service.GameAct().Saves() return service.GameAct().Saves()
}) })
//初始化ES
elasticsearch.Init()
//初始化指标
service.SystemCron().AddCron(v1.CronType_MINUTE, func() error {
aycache.QPS.Set(math.Round(float64(aycache.QPSCount) / 60))
aycache.QPSCount = 0
return nil
})
//初始化自启动方法 //初始化自启动方法
for _, v := range _func { for _, v := range _func {
v() v()

View File

@@ -1,6 +1,7 @@
package ip2region package ip2region
import ( import (
"github.com/ayflying/utility_go/internal/boot"
"github.com/ayflying/utility_go/service" "github.com/ayflying/utility_go/service"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gctx"
@@ -19,13 +20,16 @@ type sIp2region struct {
} }
func New() *sIp2region { func New() *sIp2region {
s := &sIp2region{}
s.Load() return &sIp2region{}
return s
} }
func init() { func init() {
service.RegisterIp2Region(New()) service.RegisterIp2Region(New())
boot.AddFunc(func() {
service.Ip2Region().Load()
})
} }
// Load 加载到内存中 // Load 加载到内存中
@@ -34,12 +38,14 @@ func init() {
// @receiver s *sIp2region: sIp2region的实例。 // @receiver s *sIp2region: sIp2region的实例。
func (s *sIp2region) Load() { func (s *sIp2region) Load() {
var err error var err error
var dbPath = "/runtime/library/ip2region.xdb"
var url = "https://github.com/ayflying/resource/raw/refs/heads/main/attachment/ip2region.xdb"
var dbPath = "runtime/library/ip2region.xdb"
if gfile.IsEmpty(dbPath) { if gfile.IsEmpty(dbPath) {
g.Log().Debug(ctx, "等待下载ip库文件")
//下载文件 //下载文件
putData, err2 := g.Client().Discovery(nil). putData, err2 := g.Client().Discovery(nil).Get(ctx, url)
Get(ctx, "https://resource.luoe.cn/attachment/ip2region.xdb")
if err2 != nil { if err2 != nil {
return return
} }

View File

@@ -1,11 +1,15 @@
package aycache package aycache
import ( import (
v1 "github.com/ayflying/utility_go/api/system/v1"
"github.com/ayflying/utility_go/internal/boot"
"github.com/ayflying/utility_go/pkg/aycache/drive" "github.com/ayflying/utility_go/pkg/aycache/drive"
drive2 "github.com/ayflying/utility_go/pkg/aycache/drive" drive2 "github.com/ayflying/utility_go/pkg/aycache/drive"
"github.com/ayflying/utility_go/service"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promauto"
"math"
) )
type Mod struct { type Mod struct {
@@ -22,6 +26,18 @@ var (
) )
) )
func init() {
boot.AddFunc(func() {
//初始化指标
service.SystemCron().AddCron(v1.CronType_MINUTE, func() error {
QPS.Set(math.Round(float64(QPSCount) / 60))
QPSCount = 0
return nil
})
})
}
func New(_name ...string) gcache.Adapter { func New(_name ...string) gcache.Adapter {
var cacheAdapterObj gcache.Adapter var cacheAdapterObj gcache.Adapter

View File

@@ -53,12 +53,52 @@ func (m *randMod) RandomAll(data map[int]int, n int) []int {
return result return result
} }
func RandomAll[t Any](data map[t]int, n int) []t {
if n > len(data) {
n = len(data)
}
rand.Seed(time.Now().UnixNano())
// 复制权重映射,避免修改原始数据
remainingWeights := make(map[t]int)
for k, v := range data {
remainingWeights[k] = v
}
result := make([]t, 0, n)
for i := 0; i < n; i++ {
totalWeight := 0
// 计算剩余元素的总权重
for _, weight := range remainingWeights {
totalWeight += weight
}
if totalWeight == 0 {
break
}
// 生成一个 0 到总权重之间的随机数
randomNum := rand.Intn(totalWeight)
currentWeight := 0
for key, weight := range remainingWeights {
currentWeight += weight
if randomNum < currentWeight {
// 将选中的元素添加到结果切片中
result = append(result, key)
// 从剩余权重映射中移除选中的元素
delete(remainingWeights, key)
break
}
}
}
return result
}
// RandByArrInt 根据传入的 interface 切片中的整数值按权重随机返回一个索引 // RandByArrInt 根据传入的 interface 切片中的整数值按权重随机返回一个索引
// 参数 s: 一个包含整数的 interface 切片,切片中的每个元素代表一个权重 // 参数 s: 一个包含整数的 interface 切片,切片中的每个元素代表一个权重
// 返回值: 随机选中的元素的索引 // 返回值: 随机选中的元素的索引
func RandByArrInt(s []interface{}) int { func (m *randMod) RandByArrInt(_s interface{}) int {
// 初始化总权重为 0 // 初始化总权重为 0
sv := 0 sv := 0
s := gconv.Ints(_s)
// 遍历切片,累加每个元素的权重 // 遍历切片,累加每个元素的权重
for i := range s { for i := range s {
sv += gconv.Int(s[i]) sv += gconv.Int(s[i])
@@ -73,7 +113,7 @@ func RandByArrInt(s []interface{}) int {
var all int var all int
// 再次遍历切片,累加权重 // 再次遍历切片,累加权重
for i := range s { for i := range s {
all += gconv.Int(s[i]) all += s[i]
// 如果当前累加的权重大于随机数,则返回当前索引 // 如果当前累加的权重大于随机数,则返回当前索引
if all > r { if all > r {
return i return i

View File

@@ -124,7 +124,7 @@ func (m *timeMod) GetDailyTimeList(time1 time.Time, time2 time.Time) (timeList [
// ExcelTime2Time excel时间转时间 (12/10/24 02:03转为时间) // ExcelTime2Time excel时间转时间 (12/10/24 02:03转为时间)
func (m *timeMod) ExcelTime2Time(excelTime string) time.Time { func (m *timeMod) ExcelTime2Time(excelTime string) time.Time {
layout := "01/02/06 15:04" // 月/日/年(最后两位) 小时:分钟 (24小时制) layout := "1/2/06 15:04" // 月/日/年(最后两位) 小时:分钟 (24小时制)
timeNew, _ := time.ParseInLocation(layout, excelTime, time.Local) timeNew, _ := time.ParseInLocation(layout, excelTime, time.Local)
return timeNew return timeNew
} }

View File

@@ -20,9 +20,9 @@ type Number interface {
int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64 int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
} }
//type Any interface { type Any interface {
// interface{} | string | int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64 string | int | int64 | int32 | int16 | uint64 | uint32 | uint16 | float32 | float64
//} }
type toolsInterface interface { type toolsInterface interface {
Load() Load()
@@ -132,7 +132,7 @@ func RemoveSlice[t Number](slice []t, value ...t) []t {
// 从后向前遍历切片 // 从后向前遍历切片
for i := len(slice) - 1; i >= 0; i-- { for i := len(slice) - 1; i >= 0; i-- {
// 检查当前元素是否等于需要移除的值 // 检查当前元素是否等于需要移除的值
if InArray(slice[i], value) { if InArray[t](value, slice[i]) {
// 如果相等,移除该元素 // 如果相等,移除该元素
// 使用append和切片操作符来实现移除操作将i之前和i之后的元素合并到一起 // 使用append和切片操作符来实现移除操作将i之前和i之后的元素合并到一起
slice = append(slice[:i], slice[i+1:]...) slice = append(slice[:i], slice[i+1:]...)
@@ -149,7 +149,7 @@ func RemoveSlice[t Number](slice []t, value ...t) []t {
// @param value 需要查找的值 // @param value 需要查找的值
// @param array 进行查找的切片 // @param array 进行查找的切片
// @return bool 返回是否存在 // @return bool 返回是否存在
func InArray[t Number](value t, array []t) bool { func InArray[t Number](array []t, value t) bool {
for _, v := range array { for _, v := range array {
if v == value { if v == value {
return true return true

View File

@@ -4,6 +4,7 @@ import (
"github.com/ayflying/utility_go/config" "github.com/ayflying/utility_go/config"
"github.com/ayflying/utility_go/internal/boot" "github.com/ayflying/utility_go/internal/boot"
_ "github.com/ayflying/utility_go/internal/logic" _ "github.com/ayflying/utility_go/internal/logic"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gctx"
) )
@@ -13,12 +14,11 @@ var (
) )
func init() { func init() {
go func() { g.Log().Debug(ctx, "utility_go init启动完成")
// 初始化配置 // 初始化配置
var err = boot.Boot() var err = boot.Boot()
if err != nil { if err != nil {
panic(err) panic(err)
} }
}()
} }

View File

@@ -1,9 +1,9 @@
package utility_go_test package utility_go_test
import ( import (
"github.com/ayflying/utility_go/internal/boot" //_ "github.com/ayflying/utility_go/internal/logic"
_ "github.com/ayflying/utility_go/internal/logic"
"github.com/ayflying/utility_go/internal/boot"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gctx"
"testing" "testing"