缓存和访问数据库数据的有效方法?
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。
我有一个程序(在 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。