package redis import ( "errors" "strconv" redisdb "github.com/gomodule/redigo/redis" ) //监视key递减 func WatchSub(key, value string) (bool, error) { var err error c := GetConn() reply, err := c.Do("WATCH", key) if err != nil { c.Do("UNWATCH") return false, err } reply, err = c.Do("GET", key) if err != nil { c.Do("UNWATCH") return false, err } stock, err := redisdb.Int64(reply, err) if err != nil { c.Do("UNWATCH") return false, err } use, err := strconv.ParseInt(value, 10, 64) if err != nil { c.Do("UNWATCH") return false, err } if stock < use { c.Do("UNWATCH") return false, errors.New("数量已不足") } reply, err = c.Do("MULTI") if err != nil { c.Do("UNWATCH") return false, err } num := stock - use reply, err = c.Do("SET", key, num) if err != nil { c.Do("UNWATCH") return false, err } reply, err = c.Do("EXEC") c.Do("UNWATCH") CloseConn(c) if err != nil { return false, err } if reply != nil { return true, err } return false, err }