-
Notifications
You must be signed in to change notification settings - Fork 186
Description
Looking for some feedback on whether or not this is a good idea. I'd like finer control of Touch(). Why? For a high-volume site, each Touch is a new update to deadline and therefore a new write to the data store. While some handlers will always uses sessions others will not, such as serving static files. Admittedly there are other ways to design this. For example in middleware, I could skip calling Touch for any path serving static files. But a few seconds delay in Touch would serve the same purpose. (And for those static files, I'm still updating global statistics - just not session stats on the static files - which I'm not tracking.)
What if there was a TouchIntervalRate to control how often the deadline gets updated via touch? It could manifest itself a few ways. Arguably the easiest is a new function, session.TouchWithInterval()
.
// in session.go
// TouchWithInterval func controls the rate at which touches are automatically written via Touch
// there can be quite a few quick touches - which mean writes back to the datastore
// would require a private "isNew" var added to manager.Session
func TouchWithInterval(w http.ResponseWriter, interval time.Duration) error {
if s.loadErr != nil {
return s.loadErr
}
doTouch := true
if !s.isNew && interval > 0 {
timeToTouch := time.Now().Subtract(s.deadline).Add(interval)
doTouch = timeToTouch.Afer(time.Now())
}
if doTouch {
return Touch(w)
}
return nil
}
Thoughts?