gpt4 book ai didi

session - 在 Golang 中跟踪在线用户

转载 作者:IT王子 更新时间:2023-10-29 01:38:47 27 4
gpt4 key购买 nike

很久以前,我用 Golang 建立了一个网站,现在,我想跟踪在线用户。

我想在没有 Redis 的情况下使用 SessionID 来执行此操作。

我工作的最佳方式是什么?

我写了一个全局处理程序:

type Tracker struct {
http.Handler
}

func NewManager(handler http.Handler) *Tracker {
return &Tracker{Handler: handler}
}

func (h *Tracker) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println(r.RemoteAddr)
h.Handler.ServeHTTP(w,r)
}

...

    srv := &http.Server{
Handler: newTracker(e),
Addr: "127.0.0.1" + port,
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}

log.Fatal(srv.ListenAndServe())

我认为我可以做的工作之一是:

在客户端添加一个sessionID,并保存在服务端的map中,统计在线人数并关注。

这是正确的方法吗?

最佳答案

全局处理程序、中间件(如果您使用的是路由器 pkg,请看这个)或仅在流行页面上调用统计功能就足够了。小心排除机器人、RSS 命中或其他您不关心的流量。

假设你有一个进程,并且想跟踪用户在过去 5 分钟之内的在线情况,是的, map 服务器端就可以了,你可以发布 token (取决于用户允许 cookie,在每个请求上占用带宽),或者只是散列 ip(效果很好,可能会出现轻微的低估)。然后,您需要在一段时间后使它们过期,并使用互斥锁来保护它们。重新启动时你会失去计数,如果运行两个进程你不能这样做,这是内存存储的缺点,你需要另一个缓存进程来持久化。所以这不适合大型站点,但您以后可以轻松地转向使用更持久的存储。

var PurgeInterval = 5 * time.Minute
var identifiers = make(map[string]time.Time)
var mu sync.RWMutex

...

// Hash ip + ua for anonymity in our store
hasher := sha256.New()
hasher.Write([]byte(ip))
hasher.Write([]byte(ua))
id := base64.URLEncoding.EncodeToString(hasher.Sum(nil))

// Insert the entry with current time
mu.Lock()
identifiers[id] = time.Now()
mu.Unlock()

...

// Clear the cache at intervals
mu.Lock()
for k, v := range identifiers {
purgeTime := time.Now().Add(-PurgeInterval)
if v.Before(purgeTime) {
delete(identifiers, k)
}
}
mu.Unlock()

类似的东西。

关于session - 在 Golang 中跟踪在线用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com