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 未満であり、テーブルが 1 分に 1 回しか更新されないため可能です。さらに、レーベンシュタイン距離などのより優れたマッチング アルゴリズムを実装できるようになります。

このタイプのキャッシュされたシンボル テーブルをどのように作成しますか? 明らかに、ルックアップはコード (おそらく Python) で行う必要がありますが、データをどのように保存し、1 分に 1 回同期するのでしょうか? django フロントエンド サーバーで Redis サーバーを実行していますが、永続性の問題が生じます...どんな考えも大歓迎です!

4

1 に答える 1

0

「最終更新時刻」とともに単純なハッシュ テーブルを使用するだけです。ハッシュでルックアップを行うたびに、「最終更新」時刻を確認してください。1 分以上経過している場合は、ハッシュ内のデータをダンプし、DB から再読み込みします。もちろん、競合状態を回避する必要があります...

他の方法もありますが、これが最も簡単な方法であり、正しくコーディングするのが最も簡単です。大規模な DB 操作の余分な待ち時間で 1 分あたり 1 つのトランザクションにヒットすることが許容できない場合は、もう少し複雑なものを考え出すことができます (DB 操作をバックグラウンド スレッドで非同期に実行するなど)。その不測の事態に備えて、このコードをクラスにカプセル化します。(その後、遅すぎる場合は、他のコードに影響を与えることなく実装を試すことができます。)

もちろん、さらにパフォーマンスが必要な場合は、他にもできることがあります。DB レコードに列を追加しupdated_time、最後に更新されたものだけをロードすることができます。これは実際に物事をより速くしますか?もしそうなら、違いは問題になるほど大きくなるでしょうか?試してみないとわからないことです。そのため、最初に単純なソリューションを試して、パフォーマンスの目標に到達するかどうかを確認することをお勧めします。

于 2012-09-24T18:12:37.030 に答える