缓存和访问DB数据的有效方法?

时间:2017-08-11 06:40:28

标签: c++ caching static sqlanywhere

我有一个程序(在C ++中),用户扫描条形码,查找该条形码引用的对象上的信息(来自sqlanywhere 12 DB)。 虽然每天扫描数千个条形码,但一些附加信息永远不会改变(即ID引用了一个共同的数据集,如状态)。

我想要做的是缓存一些常见数据,这些数据很少发生变化(可能每年一次)。 我可以处理这些罕见的变化(更糟糕的是,我可以大声喊出大厅重启程序(它是内部的))。

所以问题是:

缓存(和访问)此数据的最有效方法是什么。

我考虑创建一个简单的类,包含一些数据结构和静态列表,在列表中缓存,然后从列表中抓取。

然后我想也许这不是很有效???

示例:

struct my_cache_data
{
    INDEX      id;
    CString    name;
};

static std::list<my_cache_data>    s_my_cached_list;
static CCrtiticalSection           s_crit;

void Get_Data(my_cache_data &data, INDEX id)
{
    static std::list<my_cache_data>::iterator    it;

    for(it = s_my_cached_list; it != s_my_cached_list; ++it)
    {
        if((*it).id == id)
        {
            data = *it;
            return;
        }
    }
    Cache_data(data, id);
}

void Cache_data(my_cache_data &data, INDEX id)
{
    ... Do DB stuff
    s_my_cached_list.push_back(data);
}

1 个答案:

答案 0 :(得分:0)

如果你想自己做,那么我建议std::unordered_map而不是std::list

请参阅并比较std::liststd::unordered_map的存储和检索操作的复杂性。我假设你的案例中的sudo /opt/lampp/lampp restart 对于一个条目总是唯一的,即它就像DB表一样充当主键(PK)。因此,使用std::unordered_map,您将获得平均常数时间,例如id,以便进行搜索。

如果您的用例涉及排序,您可以查看std::map。但是,我对此表示怀疑。

此外,如果您想拥有一个具有高级功能的完整缓存系统,那么您可能需要考虑Redis