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

Efficient way to cache and access DB Data?

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

我想做的是缓存一些很少更改(可能每年一次)的公共数据。 我可以处理这些罕见的变化(更坏的情况,我可以大声喊叫重新启动程序(它是内部的))。

所以问题是:

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

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

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

示例:

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);
}

如果你想自己做,我建议 std::unordered_map instead of std::list

参考并比较 std::list and std::unordered_map. I assume that the id in your case is always unique for an entry i.e. it acts like a primary key (PK) as in case of DB table. So, using std::unordered_map 的存储和检索操作的复杂性,你会得到平均恒定时间,即 O(1) 在搜索的情况下。

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

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