我有一个程序(在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);
}
答案 0 :(得分:0)
如果你想自己做,那么我建议std::unordered_map
而不是std::list
。
请参阅并比较std::list
和std::unordered_map
的存储和检索操作的复杂性。我假设你的案例中的sudo /opt/lampp/lampp restart
对于一个条目总是唯一的,即它就像DB表一样充当主键(PK)。因此,使用std::unordered_map
,您将获得平均常数时间,例如id
,以便进行搜索。
如果您的用例涉及排序,您可以查看std::map
。但是,我对此表示怀疑。
此外,如果您想拥有一个具有高级功能的完整缓存系统,那么您可能需要考虑Redis。