我有一个用.NET编写的客户端/服务器架构,其中有数百个客户端将数据发送到一台服务器。每个项目都有一个ID,不同的客户端可以多次发送相同的ID。
ID是长的,服务器需要知道它是否已收到具有相同ID的内容。每天服务器将获得大约10,000,000个ID,其中包含大约1,000,000个重复项。每当它收到一个id时,它将需要进行某种查找以查看它是否已经被处理过。几天后,极不可能获得重复的ID。
我目前的解决方案是:
在具有后台线程的ID的内存字典中,删除任何在字典中超过3天后的项目。
MySql数据库,其中包含一个用于ID的索引列和一个用于插入日期的列。
我认为的问题是查询对MySql数据库的速度有多快,因为我每天要做10,000,000次查询。我不打算在这个特定问题(典型的开发系统)中使用花哨的硬件,并且不想100%征税。 内存解决方案的问题在于编写后台工作程序(并发)会很麻烦,并且一切都会在不太可能但可能发生的崩溃中丢失。
答案 0 :(得分:0)
不确定MySQL部分 - 通常它可以使用您使用的硬件进行扩展......
对于Dictionary部分,只需使用ConcurrentDictionary
- 这是线程安全且非常快,因为大多数操作都是无锁实现的。
答案 1 :(得分:0)
您可以尝试key value store。
删除过时密钥(ID)的性能可能是一个问题,因为您需要查找每个值(插入日期),但它应该很容易测试。如果您需要在商店和服务器之间建立缓存,那么测试也应该非常简单。
除了上面链接中的项目,您可以考虑Berkeley DB,它有一个C#API并包含一个内存缓存。