示例#1
0
// LEVELDB恢复到REDIS的具体实现
func restore(ud interface{}, key string, cli *redis.Redis) (err error) {
	context := ud.(*Context)
	db := context.db
	var chunk []byte
	if chunk, err = db.Get([]byte(key)); err != nil {
		Error("query key %s failed:%v", key, err)
		return
	}

	if chunk == nil {
		err = errors.New("key doesn't exist on leveldb")
		return
	}

	var leveldb_data map[string]string
	err = json.Unmarshal(chunk, &leveldb_data)
	if err != nil {
		Error("chunk is not json:%s", key)
		return
	}
	redis_data := make(map[string]string)
	err = cli.Hgetall(key, redis_data)
	if err != nil {
		Error("hgetall key %s failed:%v", key, err)
		return
	}

	if redis_data["version"] >= leveldb_data["version"] && len(redis_data) > 0 {
		Info("redis_data[version]:%s >= leveldb_data[version]:%s", redis_data["version"], leveldb_data["version"])
		return
	}
	leveldb_array := make([]interface{}, len(leveldb_data)*2+1)
	leveldb_array[0] = key
	i := 1
	for k, v := range leveldb_data {
		leveldb_array[i] = k
		leveldb_array[i+1] = v
		i = i + 2
	}
	_, err = cli.Exec("hmset", leveldb_array...)
	if err != nil {
		Error("hmset key %s failed:%v", key, err)
		return
	}
	return
}