func (s *Server) ExpireAt(cli *Client) error { if cli.argc != 3 { return cli.ErrorResponse(wrongArgs, "pexpireat") } var resp string key := string(cli.argv[1]) expireTime, err := strconv.Atoi(string(cli.argv[2])) if err != nil { return cli.ErrorResponse(wrongArgType) } expired := int64(expireTime * 100000) nowMs := common.GetMsTime() db := s.db[cli.selectDb] db.Lock() val := db.LookupKey(key) if val == nil { resp = zeroKey } else { if nowMs >= expired { db.DeleteKey(key) } else { ele := NewElement(JON_INT64, expired) db.SetExpire(key, ele) } resp = oneKey } db.Unlock() return cli.Write(resp) }
func (o *aof) bgRewrite(dbs []*JonDb) error { var err error var fname string var tnow int64 tnow = common.GetMsTime() fname = fmt.Sprintf("temp-%d.aof", os.Getpid()) f, err := os.OpenFile(fname, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0666) if err != nil { return err } o.aofHandler = f for i, db := range dbs { if db.Dict.Size() <= 0 { continue } is := fmt.Sprintf("%d", i) selectCmd := fmt.Sprintf("*2\r\n$6\r\nselect\r\n$%d\r\n%d\r\n", len(is), i) o.Write(selectCmd) var ex bool = false var extime int64 var cmd string for key, ele := range db.Dict.DataMap { exp, ok := db.Expires.DataMap[key] if ok { extime = exp.Value.(int64) if extime <= tnow { continue } ex = true } else { ex = false } switch ele.Type { case JON_STRING: val := ele.Value.(string) cmd = fmt.Sprintf("*3\r\n$3\r\nset\r\n$%d\r\n%s\r\n$%d\r\n%s\r\n", len(key), key, len(val), val) case JON_LIST: val := ele.Value.([][]byte) valLen := len(val) cmd = fmt.Sprintf("*%d\r\n$5\r\nlpush\r\n$%d\r\n%s\r\n", 2+valLen, len(key), key) for _, v := range val { cmd = fmt.Sprintf("%s$%d\r\n%s\r\n", cmd, len(v), v) } case JON_HASH: val := ele.Value.(map[string]string) mapLen := len(val) cmd = fmt.Sprintf("*%d\r\n$5\r\nhmset\r\n$%d\r\n%s\r\n", 2+2*mapLen, len(key), key) for k, v := range val { cmd = fmt.Sprintf("%s$%d\r\n%s\r\n$%d\r\n%s\r\n", cmd, len(k), k, len(v), v) } case JON_SET: case JON_SORTSET: } o.Write(cmd) if ex { expCmd := fmt.Sprintf("*3\r\n$9\r\npexpireat\r\n$%d\r\n%s\r\n$%d\r\n%d\r\n", len(key), key, len(fmt.Sprintf("%d", extime)), extime) o.Write(expCmd) } } } o.Flush() os.Rename(fname, "append.aof") return nil }