31

私が実装しようとしているのはidテーブルです。基本的に、user_id は User テーブルの主キーを参照し、lecturer_id は Lecturer テーブルの主キーを参照する構造 (user_id、letudent_id) を持っています。

これをredisに実装しようとしていますが、キーをユーザーのプライマリIDとして設定した場合、講師はキーではないため、講師ID = 5ですべてのレコードを取得するようなクエリを実行しようとすると、はありませんO(1)時間で到達できます。

上記で言及した id テーブルのような構造を形成するにはどうすればよいですか、または Redis はそれをサポートしていませんか?

4

2 に答える 2

37

redis を使用しているときにすぐに学べることの 1 つは、特にリレーションに関しては、アクセスのニーズに合わせてデータ構造を設計できることです (結局のところ、これはリレーショナル データベースではありません)。

すでにお気づきのように、O(1) 時間の複雑さで「値」で検索する方法はありませんが、redis を使用して記述した内容にアプローチする方法はあります。これが私がお勧めするものです:

  • すでに行っているように、ユーザーデータをユーザー ID (ハッシュなど) で保存します。
  • 問題の講師 ID に対応するすべてのユーザー ID を含む、講師 ID ごとに追加のセットを用意します。

これは、リレーションのデータを複製するように見えるかもしれません。ユーザー データにレクチャー ID を保存する必要があり、レクチャー データにユーザー ID を保存する必要があるためです。 -redis のようなリレーショナル データ ストア。実際には、これはうまく機能します。小規模なデータセット (数千の ID を考えてください) の場合、メモリがボトルネックになることはめったにありません。

リレーションを使用してアプリケーションをモデル化するために redis を使用する方法をよりよく理解するには、redis の作成者であるSalvatore Sanfilippoによって書かれたDesign and implementation of a simple Twitter cloneとLamernewsのソース コードを読むことをお勧めします。

于 2012-10-05T13:41:52.937 に答える
0

すでに回答されているように、バニラ Redis では、データを一度だけ保存して、Redis にクエリを実行させる方法はありません。

セカンダリ インデックスを自分で維持する必要があります。

ただし、Redis のモジュールでは、これは必須ではありません。zeeSQLRediSearchなどのモジュールを使用すると、Redis にデータを直接保存し、SQL クエリ (zeeSQL の場合) または RediSearch の simil SQL でデータを取得できます。

あなたの場合、zeeSQLの小さな例です。

> ZEESQL.CREATE_DB DB
OK
> ZEESQL.EXEC DB COMMAND "CREATE TABLE user(user_id INT, lecture_id INT);"
OK
> ZEESQL.EXEC DB COMMAND "SELECT * FROM user WHERE lecture_id = 3;"
... your result ...
于 2021-03-01T22:13:27.657 に答える