缓存数据结构设计

时间:2012-05-13 16:38:40

标签: c++ data-structures

我有一个需要访问此风数据的C ++程序,每6小时刷新一次。由于服务器的客户端需要数据,服务器查询数据库并将数据提供给客户端。客户端将使用lat,lon和mb作为键来查找5个值。

+------------+-------+-----+-----+----------+----------+-------+------+------+
| id         | lat   | lon | mb  | wind_dir | wind_spd | uv    | vv   | ts   |
+------------+-------+-----+-----+----------+----------+-------+------+------+
| 1769584117 | -90.0 | 0.0 | 100 |      125 |        9 | -3.74 | 2.62 | 2112 |
| 1769584118 | -90.0 | 0.5 | 100 |      125 |        9 | -3.76 | 2.59 | 2112 |
| 1769584119 | -90.0 | 1.0 | 100 |      124 |        9 | -3.78 | 2.56 | 2112 |

由于数据不经常更改,我希望服务器缓存数据,因此如果客户端需要先前查询的数据,则不需要第二个SQL查询。

我试图在存储/速度方面确定最有效的内存数据结构,但更重要的是,易于访问。

我最初的想法是一个由lat键入的地图,其中包含一个由lon键入的地图,其中包含一个由mb键入的地图,其值是包含wind_dir,wind_speed,uv,vv和ts字段的地图。

但是,这很复杂。另一个想法当然是包含最后5个字段的结构的三维数组(lat,lon,mb索引)。

当我坐在这里时,我提出了将lat,lon和mb组合成一个字符串的想法,这可以用作地图的索引,因为我99%肯定了lat的组合,lon和mb永远是独一无二的。

还有哪些其他想法有意义?

编辑:下面评论的更多细节

就数据而言,数据集中有3,119,040行。这将是相当稳定的,尽管随着新报告站的增加,这些年可能会缓慢增长。通常有700到1500个客户端请求数据。客户是飞行模拟器。默认情况下,他们每5分钟会请求一次数据,但最大可能的频率是每30秒。没有其他信息 - 您在上面看到的是希望返回的数据。

最后一点我忘了提到:我的C ++特别是STL的东西很生锈,所以更简单,更好。

3 个答案:

答案 0 :(得分:1)

您可以将std::map与三部分密钥和一个合适的小于运算符一起使用(这是Crazy Eddie提出的,扩展了一些代码行)

struct key
{
    double mLat;
    double mLon;
    double mMb;
    key(double lat, double lon, double mb) :
        mLat(lat), mLon(lon), mMb(mb) {}
};

bool operator<(const key& a, const key& b)
{
    return (a.lat <  b.lat ||
            a.lat == b.lat && a.lon <  b.lon ||
            a.lat == b.lat && a.lon == b.lon && a.mb < b.mb);
}

定义并插入地图将如下所示:

std::map<key, your_wind_struct> values;
values[key(-90.0, 0.0, 100)] = your_wind_struct(1769584117, 125, ...);

答案 1 :(得分:0)

有序矢量也很有意义。您可以使用较少的谓词来比较您的三部分键。您可以使用地图或集合执行相同操作。哈希...取决于您选择的容器的很多因素。

答案 2 :(得分:0)

另一个选项是c ++ 11 unordered_set,它使用哈希表而不是红黑树作为内部数据结构,并给出(我相信)O(1)vs O(logn)的摊销查找时间红黑。您使用哪种数据结构取决于所讨论数据的特征 - 有多少数据,可能访问特定记录的频率等等。我同意几个评论员的意见,即使用结构作为关键是最干净的方式。它还允许您更简单地改变唯一键的内容,如果将来发生变化;你只需要在你的键结构中添加一个成员,而不是创建一个全新的地图级别。