// 无条件设置 sid-Session func Set(sid string, ss *Session) (err error) { SessionBytes, err := json.Marshal(ss) if err != nil { return } item := memcache.Item{ Key: mc.SessionKey(sid), Value: SessionBytes, } return mc.Client().Set(&item) }
// 设置 sid-Session, 该 Session 是通过 Get 获取的, // 如果在 Get 之后该 sid 对应的 Session 发生改变, 则返回错误. func CompareAndSwap(sid string, ss *Session) (err error) { item := ss.memcacheItem if item == nil || item.Key != mc.SessionKey(sid) { return fmt.Errorf("参数 Session 不是通过 sid:%q 获取的", sid) } SessionBytes, err := json.Marshal(ss) if err != nil { return } item.Value = SessionBytes return mc.Client().CompareAndSwap(item) }
// 获取 Session, 如果找不到返回 errors.ErrNotFound. func Get(sid string) (ss *Session, err error) { item, err := mc.Client().Get(mc.SessionKey(sid)) if err != nil { if err == memcache.ErrCacheMiss { err = errors.ErrNotFound } return } ss = &Session{} if err = json.Unmarshal(item.Value, ss); err != nil { return } ss.memcacheItem = item return }
// 删除 Session, 如果没有匹配则返回 errors.ErrNotFound. func Delete(sid string) (err error) { if err = mc.Client().Delete(mc.SessionKey(sid)); err == memcache.ErrCacheMiss { err = errors.ErrNotFound } return }