Redis(hiredis)SET命令模板的高效处理

3

我对Redis还很陌生,我想编写一个简单的库(用于测试),它位于hiredis的顶层。 例如,为了实现SET命令,我编写了下面的代码:

#include<iostream>
#include<type_traits>
#include<hiredis.h>
#include<string>

using namespace std;

template<typename T>
string set(string key, T value)
{
    /* set a key */
    if(is_same<T, int>::value)
    {
        reply = (redisReply*) redisCommand(c, "SET %s %d", key, value)  // c is redisContext* 
    }
    else if(is_same<T, string>::value)
    {
        reply = (redisReply*) redisCommand(c, "SET %s %s", key, value)
    }

    // and so on for other data types ...

    string replyStr = reply->str;
    freeReplyObject(reply);
    return replyStr;     
}

有没有更好的解决方案来处理不同数据类型作为SET命令的值?(我的意思是避免对每种数据类型使用if语句)。 致敬。
1个回答

1
如果我理解正确,您只需要知道value的类型,才能知道在编写回复时将要插入哪种类型到您的redisCommand字符串中。
如果您将这些类型限制为基本类型,请尝试调用to_string来构建结果std::string 有关更多信息https://en.cppreference.com/w/cpp/string/basic_string/to_string,当然不要忘记包含头文件!
像这样:
template<typename T>
string set(string key, T value)
{
    std::string result(std::string("SET ") + to_string(key) + to_string(value));
    reply = (redisReply*) redisCommand(c, result);

    string replyStr = reply->str;
    freeReplyObject(reply);
    return replyStr;     
}

编辑:另一个可行的解决方案是每次调用“set”时都对变量进行转换,并将函数简单重写为string set(string key, string value)

谢谢。我还有一个问题,就是在Redis中使用set key value保存的每个值都是字符串吗?我的意思是,如果我稍后使用Type key命令,它是否总是返回这些SET命令的字符串类型? - Jafar Gh
根据我在 https://redis.io/commands/set 所了解的,字符串仅用于设置。如果您想在类似于 https://redis.io/commands/get 的操作中使用它,则返回值将是一个字符串。 - Luisjomen2a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接