2016-11-17 13 views
2

現在、Redisをアプリケーション用のメモリ内データベースとして使用したいと考えており、Redisデータベースを初めて使用しています。 Redisの値としてClassオブジェクトをどのように格納できるか教えてください。 Classオブジェクトをcharバッファに変換し、Redis Databaseに文字列として格納しようとしました。その後、Redisから文字列として取得し、それをクラスオブジェクトに変換します。私たちが見たところでは、(Redisから取得した)文字列をClassオブジェクトに変換した後、いくつかの迷惑メールの値が与えられています。どのようにC++クラスオブジェクトをRedisデータベースの値として保存できますか?

だから、あなたはここで私たちを助けてくださいでした。

注:私たちは、Redisのに格納するBASE64_ENCODEとBASE64_DECODEを使用して、クラスオブジェクトから文字バッファーに、我々は、memcpyを/ reinterpret_castはを使用していました。ここで、デコードとエンコーディングは、Redisデータベースを使用せずに正常に動作しています。しかし、Redisデータベースを格納してからデコードとエンコードを行うと、動作しません。

ありがとうございました。

+0

:ここ

cerealとの一例です。コードに問題がある可能性があります。ところで、Redisはバイナリ文字列を保存できるので、データのエンコードとデコードにbase64を使う必要はありません。 –

+0

は、<「我々はバッファcharにClassオブジェクトを変換して試してみました」 - どのようにシリアライズを行う(その後、「変換」)でした - 私は、これが問題になる可能性が疑われますか? –

+0

@for_stackとItamar Habar、あなたのコメントをありがとう、今我々はcharバッファを使用して適切なオブジェクトを格納し、取得することができます。 –

答えて

2

char型のバッファを持つあなたのアプローチは、ヒープメモリを割り当てない単純なクラスと理論の仕事に(あなたは、アライメントの問題を扱うことを考える)ことができます。

ではなく、穀物など、後押し::シリアライズを、いるProtobufのようないくつかのシリアル化ライブラリを使用してみてください。 Redisのは、あなたのデータは変更されません

#include <cassert> 
#include <sstream> 
#include <string> 
#include <unordered_map> 

#include <hiredis/hiredis.h> 
#include <cereal/archives/binary.hpp> 
#include <cereal/types/memory.hpp> 
#include <cereal/types/unordered_map.hpp> 

class foo { 
    int i; 
    std::string s; 
    std::unordered_map<std::string, int> m; 

    friend class cereal::access; 

    template <typename Archive> 
    void serialize(Archive& archive) { 
     archive(i, s, m); 
    } 

public: 
    foo() {} 
    foo(int i, const std::string& s) : i(i), s(s) { m[s] = i; } 

    friend bool operator==(const foo& l, const foo& r) { 
     return l.i == r.i && l.s == r.s && l.m == r.m; 
    } 
}; 

int main() { 
    std::ostringstream oss; 
    cereal::BinaryOutputArchive archive{oss}; 
    foo f{10, "bar"}; 
    archive(f); 

    auto redis_context = redisConnect("127.0.0.1", 6379); 
    const auto set_reply = 
     redisCommand(redis_context, "SET key %b", oss.str().c_str(), oss.str().length()); 
    freeReplyObject(set_reply); 

    // later on 
    const auto get_reply = 
     static_cast<redisReply*>(redisCommand(redis_context, "GET key")); 
    std::string repr{get_reply->str, static_cast<size_t>(get_reply->len)}; 
    freeReplyObject(get_reply); 

    std::istringstream iss{repr}; 
    cereal::BinaryInputArchive input(iss); 
    foo g; 
    input(g); 

    assert(f == g); 

    redisFree(redis_context); 
} 
+0

あなたの返事をありがとう、うまく説明してくれてありがとう。 –

関連する問題