lesismal / nbio

Pure Go 1000k+ connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-driven, easy-to-use.
MIT License
2.17k stars 153 forks source link

请教 在OnData中做一个并发安全的疑惑 #374

Closed joyanhui closed 10 months ago

joyanhui commented 10 months ago

和nbio无关,但是实在困惑,无奈前来请教。

有一个map,需要定时从redis更新。之前我用的另起一个协程用定时器和消息订阅来更新它。现在为了兼容serverless环境,没法这样搞了。所以想改成在客户端每次请求的时候,检查一下上次更新的时间戳,判断是否需要查询redis。

下面的nbioHandler1和nbioHandler2 不知道那个才是真的安全。


var (
    NowtimeATO       atomic.Int64
    LastUpdateCfgATO atomic.Int64
)

func nbioHandler1(w http.ResponseWriter, r *http.Request) {
    NowtimeATO.Store(time.Now().Unix())
    if NowtimeATO.Load()-LastUpdateCfgATO.Load() >= 2 {
        LastUpdateCfgATO.Store(NowtimeATO.Load())
        UpdateCfg() //更新数据到map
    }
    //other code
})

func nbioHandler2(w http.ResponseWriter, r *http.Request) {
    NowtimeATO.Store(time.Now().Unix())
    if NowtimeATO.Load()-LastUpdateCfgATO.Load() >= 2 {
        if LastUpdateCfgATO.CompareAndSwap(LastUpdateCfgATO.Load(), NowtimeATO.Load()) {
            UpdateCfg()
        }
    }
    //other code
})
joyanhui commented 10 months ago

没问题。改动了一下 nbioHandler1 没啥问题。感谢