代码之家  ›  专栏  ›  技术社区  ›  user2080797

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

  •  0
  • user2080797  · 技术社区  · 7 年前

    我有一个程序(在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 回复  |  直到 7 年前
        1
  •  0
  •   Azeem Rob Hyndman    7 年前

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

    请参阅并比较存储和检索操作的复杂性 标准::列表 .我假设 id 在您的情况下,对于条目总是唯一的,即它就像DB表中的主键(PK)一样。因此,使用 std::无序图 O(1) 在搜索的情况下。

    如果用例涉及排序,您可以查看 std::map

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