sql >> Databasteknik >  >> NoSQL >> Redis

Redigo ScanStruct-fel med time.Time

Eftersom Redis inte har något begrepp om tidsvärden skulle det inte vara meningsfullt för en generisk drivrutin som Redigo att utföra någon automatisk konvertering mellan den inbyggda time.Time typ och en godtycklig byte-array. Som sådan är det upp till programmeraren att bestämma hur den konverteringen ska utföras.

Om du till exempel har en "Person"-typ definierad som sådan, inklusive en created_at tidsstämpel formaterad som RFC3339 (en form av ISO 8601), kan du definiera en anpassad "Timestamp"-typ med en "RedisScan"-metod enligt följande:

type Timestamp time.Time

type Person struct {
  Id        int       `redis:"id"`
  Name      string    `redis:"name"`
  CreatedAt Timestamp `redis:"created_at"`
}

func (t *Timestamp) RedisScan(x interface{}) error {
  bs, ok := x.([]byte)
  if !ok {
    return fmt.Errorf("expected []byte, got %T", x)
  }
  tt, err := time.Parse(time.RFC3339, string(bs))
  if err != nil {
    return err
  }
  *t = Timestamp(tt)
  return nil
}

// ...

response, err := redis.Values(conn.Do("HGETALL", "person:1"))
if err != nil {
  panic(err)
}

var p Person
err = redis.ScanStruct(response, &p)
if err != nil {
  panic(err)
}
log.Printf("OK: p=%v", p)



  1. Hur kan jag fråga mongodb med mongoid/rails utan tidsgräns?

  2. Vad är Hadoop Reducer Class i MapReduce?

  3. Namnkonvention och giltiga tecken för en Redis-nyckel

  4. Ange flera kriterier för matriselement