0

我们有以下 MySQL 数据库表,其中包含大约 75,000 个条目。表中的每个条目都代表系统中的一个符号,可以为其检索更多数据。出于自动完成目的查询此表 - 用户查找一个符号,然后将其与符号的名称或其标签(分号分隔的字符串列表)匹配。当用户选择正确的符号时,会获取相关数据。这是表的描述:

CREATE TABLE `symbols` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,   
  `name` varchar(512) NOT NULL,  
  `tags` varchar(512) DEFAULT NULL,  
  `type` enum('1','2','3','4','5','6','7','8','9') NOT NULL,  
  `popularity` int(11) DEFAULT '0',  
  PRIMARY KEY (`id`),  
  UNIQUE KEY `uc_symbol_name` (`type`,`symbol`),  
  KEY `symbol_idx` (`symbol`),  
  KEY `type_popularity_idx` (`type`,`popularity`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

上表与大量数据一起存储在后端机器上,后端机器通过 JSON API 提供这些数据。目前,我们的前端 JavaScript 代码直接在 AJAX 中查询后端服务器以进行自动完成。相反,为了加快速度,我们希望在提供前端服务的服务器上创建符号表的本地缓存版本(前端是用 django 编写的)。这是可能的,因为该表包含不到 100,000 个符号,并且该表大约每分钟更新一次。此外,它将允许我们实现更好的匹配算法,如 Levenshtein 距离。

您将如何创建这种类型的缓存符号表?显然,查找必须在代码中进行(可能是 Python),但是您将如何存储数据,以及如何每分钟同步一次?我们在 django 前端服务器上运行了一个 Redis 服务器,但这引入了持久性问题......任何想法都非常欢迎!

4

1 回答 1

0

只需使用一个简单的哈希表,以及“最后更新时间”。每次在哈希中查找时,请检查“最后更新”时间。如果超过一分钟,则转储散列中的数据并从数据库重新加载。当然,你必须确保避免竞争条件......

还有其他选择,但这是最简单的方法,并且最容易正确编码。如果您发现无法接受每分钟处理一个事务而导致大型数据库操作的额外延迟是不可接受的,那么您可以想出一些更复杂的东西(例如在后台线程上异步运行数据库操作)。要为这种可能性做准备,请将此代码封装在一个类中。(然后,如果它太慢,您可以在不影响任何其他代码的情况下使用实现。)

当然,如果您需要更高的性能,您还可以做其他事情。您可以在数据库记录中添加一updated_time列,然后仅加载自上次以来已更新的记录。这真的会让事情变得更快吗?如果是这样,差异是否会大到足以影响?除非您尝试一下,否则无法知道。这就是为什么最好先尝试更简单的解决方案,看看它是否达到您的性能目标。

于 2012-09-24T18:12:37.030 回答