Commit 873bdca7 by hcy

并发问题

parent 43292f45
...@@ -68,6 +68,10 @@ func CommonController(ctx *gin.Context) map[string]interface{} { ...@@ -68,6 +68,10 @@ func CommonController(ctx *gin.Context) map[string]interface{} {
} }
//////////初始化公共变量 以及 批量查询/////////// //////////初始化公共变量 以及 批量查询///////////
redisLySkuArr := make(map[string]string) //redis.sku
redisZySkuArr := make(map[string]string) //redis.Self_SelfGoods
preSkuIds := make([]int64, 0) //归档sku
zyGoodsId := make([]string, 0, goodsSliceCount) zyGoodsId := make([]string, 0, goodsSliceCount)
lyGoodsId := make([]string, 0, goodsSliceCount) lyGoodsId := make([]string, 0, goodsSliceCount)
...@@ -79,17 +83,20 @@ func CommonController(ctx *gin.Context) map[string]interface{} { ...@@ -79,17 +83,20 @@ func CommonController(ctx *gin.Context) map[string]interface{} {
} }
} }
//批量查询redis-sku信息 //批量查询redis-sku信息
redisLySkuArr := gredis.Hmget("default_r", "sku", lyGoodsId) if len(lyGoodsId) > 0 {
redisLySkuArr = gredis.Hmget("default_r", "sku", lyGoodsId)
//批量查询归档的sku //批量查询归档的sku
preSkuIds := make([]int64, 0) for _, goodsId := range goodsIdArr {
for _, goodsId := range goodsIdArr { if redisLySkuArr[goodsId] == "" {
if redisLySkuArr[goodsId] == "" { preSkuIds = append(preSkuIds, gconv.Int64(goodsId))
preSkuIds = append(preSkuIds, gconv.Int64(goodsId)) }
} }
} }
if len(zyGoodsId) > 0 {
redisZySkuArr = gredis.Hmget("default_r", "Self_SelfGoods", zyGoodsId)
}
if len(preSkuIds) > 0 { if len(preSkuIds) > 0 { //存在归档sku
var prevSkuArr []bson.M var prevSkuArr []bson.M
prevSkuMongo := mongo.Conn("pre_sku") prevSkuMongo := mongo.Conn("pre_sku")
...@@ -120,8 +127,8 @@ func CommonController(ctx *gin.Context) map[string]interface{} { ...@@ -120,8 +127,8 @@ func CommonController(ctx *gin.Context) map[string]interface{} {
/////////////////多线程/////////////////////////// /////////////////多线程///////////////////////////
var wg sync.WaitGroup var wg sync.WaitGroup
ch := make(chan sync.Map, 500) //管道 ch := make(chan sync.Map, len(goodsIdArr)) //管道
semaphore := make(chan struct{}, 10) // 限制最大并发数为10 semaphore := make(chan struct{}, 10) // 限制最大并发数为10
temp := make(map[string]interface{}) //最后输出计算结果 temp := make(map[string]interface{}) //最后输出计算结果
sd := 0 sd := 0
...@@ -130,27 +137,27 @@ func CommonController(ctx *gin.Context) map[string]interface{} { ...@@ -130,27 +137,27 @@ func CommonController(ctx *gin.Context) map[string]interface{} {
if goodsId == "" { if goodsId == "" {
continue continue
} }
if len(goodsId) < 19 { //自营 if len(goodsId) < 19 { //自营
zyGoodsId = append(zyGoodsId, goodsId) common.PrintDebugHtml(ctx, "zy增加协程:"+goodsId)
if len(zyGoodsId) >= goodsSliceCount { //单个sku详情
common.PrintDebugHtml(ctx, "zy增加协程1001:") if _, ok := redisLySkuArr[goodsId]; !ok {
common.PrintDebugHtml(ctx, zyGoodsId) temp[goodsId] = false
wg.Add(1) //协程计数一 continue
semaphore <- struct{}{} // 获取信号量 }
skuStr := redisZySkuArr[goodsId]
idsToProcess := make([]string, len(zyGoodsId)) wg.Add(1) //协程计数一
copy(idsToProcess, zyGoodsId) semaphore <- struct{}{} // 获取信号量
// 启动协程,传递独立的 context 和参数,而不是 gin.Context // 启动协程,传递独立的 context 和参数,而不是 gin.Context
go func(ctx context.Context, params service.RequestParams, goodsIds []string, ch chan sync.Map) { go func(ctx context.Context, params service.RequestParams, skuStr, goods_id string, ch chan sync.Map) {
defer wg.Done() defer wg.Done()
defer func() { <-semaphore }() // 释放信号量 defer func() { <-semaphore }() // 释放信号量
zyService.ZyGoodsDetail(ctx, params, goodsIds, ch) zyService.ZyGoodsDetail(ctx, params, skuStr, goods_id, ch)
}(ctx, requestParams, idsToProcess, ch) }(ctx, requestParams, skuStr, goodsId, ch)
zyGoodsId = zyGoodsId[:0]
}
} else { //联营 } else { //联营
common.PrintDebugHtml(ctx, "ly增加协程:"+goodsId) common.PrintDebugHtml(ctx, "ly增加协程:"+goodsId)
...@@ -170,7 +177,10 @@ func CommonController(ctx *gin.Context) map[string]interface{} { ...@@ -170,7 +177,10 @@ func CommonController(ctx *gin.Context) map[string]interface{} {
// 启动协程,传递独立的 context 和参数,而不是 gin.Context // 启动协程,传递独立的 context 和参数,而不是 gin.Context
go func(ctx context.Context, params service.RequestParams, skuStr, goodsId, spuStr string, ch chan sync.Map, tag int) { go func(ctx context.Context, params service.RequestParams, skuStr, goodsId, spuStr string, ch chan sync.Map, tag int) {
defer wg.Done() defer wg.Done()
defer func() { <-semaphore }() // 释放信号量 defer func() {
//println("释放信号:" + gconv.String(sd) + " time" + gconv.String(time.Now().UnixMilli()))
<-semaphore
}() // 释放信号量
lyService.LyGoodsDetail(ctx, params, skuStr, goodsId, spuStr, ch, tag) lyService.LyGoodsDetail(ctx, params, skuStr, goodsId, spuStr, ch, tag)
}(ctx, requestParams, skuStr, goodsId, redisLySpuArr[spuId], ch, sd) }(ctx, requestParams, skuStr, goodsId, redisLySpuArr[spuId], ch, sd)
......
...@@ -674,3 +674,14 @@ func CheckIntSliceContains(target int, slice []int) bool { ...@@ -674,3 +674,14 @@ func CheckIntSliceContains(target int, slice []int) bool {
} }
return false return false
} }
// 返回带小数点的时间戳,字符串
func ProTime() string {
now := time.Now()
// 获取秒级时间戳
seconds := now.Unix()
// 获取毫秒部分
milliseconds := now.UnixNano()/1e6 - seconds*1000
// 格式化为 "秒.毫秒" 格式
return fmt.Sprintf("%d.%03d", seconds, milliseconds)
}
...@@ -2,6 +2,9 @@ package service ...@@ -2,6 +2,9 @@ package service
import ( import (
"context" "context"
"github.com/gogf/gf/util/gconv"
"github.com/gomodule/redigo/redis"
"github.com/tidwall/gjson"
"go_sku_server/model" "go_sku_server/model"
"go_sku_server/pkg/common" "go_sku_server/pkg/common"
"go_sku_server/pkg/gredis" "go_sku_server/pkg/gredis"
...@@ -12,10 +15,6 @@ import ( ...@@ -12,10 +15,6 @@ import (
"gopkg.in/mgo.v2/bson" "gopkg.in/mgo.v2/bson"
"sort" "sort"
"sync" "sync"
"github.com/gogf/gf/util/gconv"
"github.com/gomodule/redigo/redis"
"github.com/tidwall/gjson"
) )
type LyService struct { type LyService struct {
...@@ -37,7 +36,7 @@ type Power struct { ...@@ -37,7 +36,7 @@ type Power struct {
*/ */
func (ls *LyService) LyGoodsDetail(ctx context.Context, params RequestParams, skuStr, goodsId, spuStr string, ch chan sync.Map, tag int) { func (ls *LyService) LyGoodsDetail(ctx context.Context, params RequestParams, skuStr, goodsId, spuStr string, ch chan sync.Map, tag int) {
//start_time := gconv.String(time.Now().UnixMilli()) start_time := common.ProTime()
redisConn := gredis.Conn("search_r") redisConn := gredis.Conn("search_r")
redisConnSpu := gredis.Conn("spu") redisConnSpu := gredis.Conn("spu")
// 连接prev_sku MongoDB // 连接prev_sku MongoDB
...@@ -273,7 +272,10 @@ func (ls *LyService) LyGoodsDetail(ctx context.Context, params RequestParams, sk ...@@ -273,7 +272,10 @@ func (ls *LyService) LyGoodsDetail(ctx context.Context, params RequestParams, sk
//退出通道 //退出通道
ch <- GoodsRes ch <- GoodsRes
//println("---tag:" + gconv.String(tag) + "-----goodsId:" + goodsId + "--start_time:" + start_time + " ---end_time:" + gconv.String(time.Now().UnixMilli())) if (gconv.Int64(start_time) - gconv.Int64(common.ProTime())) > 2 {
println("---超时:" + gconv.String(tag) + "-----goodsId:" + goodsId + "--start_time:" + start_time + " ---end_time:" + common.ProTime())
}
} }
// 获取活动 // 获取活动
......
...@@ -75,14 +75,14 @@ func (ss *SampleService) GetSampleList(ctx *gin.Context) (data map[string]interf ...@@ -75,14 +75,14 @@ func (ss *SampleService) GetSampleList(ctx *gin.Context) (data map[string]interf
func (ss *SampleService) GetGoods(ctx *gin.Context, goodsIds []string) map[string]interface{} { func (ss *SampleService) GetGoods(ctx *gin.Context, goodsIds []string) map[string]interface{} {
// 提取请求参数 // 提取请求参数
params := ExtractRequestParams(ctx) //params := ExtractRequestParams(ctx)
// 创建带超时的 context // 创建带超时的 context
ctxWithTimeout, cancel := context.WithTimeout(context.Background(), 20*time.Second) ctxWithTimeout, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel() defer cancel()
//抽取自营 或者联营 goods_id //抽取自营 或者联营 goods_id
zyService := ZiyingService{} //实例化自营查询 //zyService := ZiyingService{} //实例化自营查询
//lyService := LyService{} //实例化联营查询 //lyService := LyService{} //实例化联营查询
ch := make(chan sync.Map) //管道 ch := make(chan sync.Map) //管道
p := 0 //总共协程 p := 0 //总共协程
...@@ -95,7 +95,7 @@ func (ss *SampleService) GetGoods(ctx *gin.Context, goodsIds []string) map[strin ...@@ -95,7 +95,7 @@ func (ss *SampleService) GetGoods(ctx *gin.Context, goodsIds []string) map[strin
if len(goodsId) < 19 { //自营 if len(goodsId) < 19 { //自营
zyGoodsId = append(zyGoodsId, goodsId) zyGoodsId = append(zyGoodsId, goodsId)
if len(zyGoodsId) >= 10 { if len(zyGoodsId) >= 10 {
go zyService.ZyGoodsDetail(ctxWithTimeout, params, zyGoodsId, ch) // go zyService.ZyGoodsDetail(ctxWithTimeout, params, zyGoodsId, ch)
zyGoodsId = zyGoodsId[:0:0] zyGoodsId = zyGoodsId[:0:0]
p++ p++
} }
...@@ -109,7 +109,7 @@ func (ss *SampleService) GetGoods(ctx *gin.Context, goodsIds []string) map[strin ...@@ -109,7 +109,7 @@ func (ss *SampleService) GetGoods(ctx *gin.Context, goodsIds []string) map[strin
} }
} }
if len(zyGoodsId) > 0 { if len(zyGoodsId) > 0 {
go zyService.ZyGoodsDetail(ctxWithTimeout, params, zyGoodsId, ch) //go zyService.ZyGoodsDetail(ctxWithTimeout, params, zyGoodsId, ch)
p++ p++
} }
if len(lyGoodsId) > 0 { if len(lyGoodsId) > 0 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment