【问题标题】:Efficient way to cache and access DB Data?缓存和访问数据库数据的有效方法?
【发布时间】:2017-08-11 15:22:17
【问题描述】:

我有一个程序(在 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);
}

【问题讨论】:

    标签: c++ caching static sqlanywhere


    【解决方案1】:

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

    参考并比较std::liststd::unordered_map 的存储和检索操作的复杂性。我假设您的情况下的 id 对于条目来说始终是唯一的,即它就像数据库表中的主键(PK)一样。因此,使用std::unordered_map,您将获得平均恒定时间,即在搜索的情况下为O(1)

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

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

    【讨论】:

    • 不幸的是,我的标准库没有 unordered_map,但它确实有映射(此时我不想添加任何库)。地图看起来应该更快,是的,我的 ID 是唯一的。谢谢!
    • @Bob:不客气! :) 然后使用std::map。它会达到目的。
    • 我已经实现了我的新缓存,并设法将查找时间缩短了 3 秒(原为 5 秒),再次感谢您
    • @Bob:太棒了! :) 但是,为什么是 2 秒?查找时间为 2 秒的数据集大小是多少?而且,您预计此缓存中内存中的最大数据集(最坏情况)是多少?
    • 数据分散在翻转的地方。用户扫描生产订单,然后程序需要获取所有相关数据,测试可能影响生产流程的潜在变化,然后计算需要运行的工作站的“地图”以及在某些情况下以何种顺序运行也可以将一个较大的顺序分解为多个较小的顺序,然后创建一个平行的地图,并在制作后再次将这些碎片组合在一起。
    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多