web-dev-qa-db-ja.com

SQLのようなRedisデータベーステーブルを設計しますか?

データベーステーブルの構造が次のようであるとします。

id name college address
1  xxx   nnn     xn
2  yyy   nnm     yn
3  zzz   nnz     zn

このようにSQLの名前に基づいて学生の詳細を取得したい場合は、select * from student where name = 'xxx'を選択して、redisデータベースでどのようにそれを可能にするか

16
Hari Haran

他のNoSQLデータストアと同様に、Redisには、実行する内容に基づいて異なる要件があります。

Redisには、必要に応じて役立つデータ構造がいくつかあります。たとえば、select * from student where name = 'xxx' Redis hashを使用できます。

redis 127.0.0.1:6379> hmset xxx id 1 college nnn address xn
OK
redis 127.0.0.1:6379> hgetall xxx
1) "id"
2) "1"
3) "college"
4) "nnn"
5) "address"
6) "xn"

他のクエリがある場合でも、同じことをしたいがwhere college = 'nnn'次に、データを非正規化する必要があります。通常、SQLでは非正規化は悪いことですが、NoSQLでは非常に一般的です。

プライマリクエリが名前に対して行われるが、大学に対してクエリを実行する必要がある場合は、ハッシュに加えてsetを追加するなどの操作を行うことができます。

redis 127.0.0.1:6379> sadd college.nnn xxx
(integer) 1
redis 127.0.0.1:6379> smembers college.nnn
1) "xxx"

このような構造のデータで、college xnに行く名前のすべての情報を検索する場合は、最初にsetを選択し、次にhashに返された名前に基づいて各setを選択します。

一般に、要件によって、使用する設計と構造が決まります。

19
sberry

たった6つの原則(私が収集した here )で、SQL志向の人がRedisのアプローチに適応するのは非常に簡単です。簡単に言うと:

  1. 最も重要なことは、多くのキーと値のペアを生成することを恐れないことです。したがって、テーブルの各行を別のキーに自由に格納してください。
  2. Redisのハッシュマップデータ型を使用する
  3. 区切り記号( ":"など)によるテーブルの主キー値からのフォームキー名
  4. 残りのフィールドをハッシュとして保存する
  5. 単一の行をクエリする場合は、キーを直接作成してその結果を取得します
  6. 範囲を照会する場合は、キーにワイルド文字「*」を使用します。

リンクは、単純なテーブルの例とRedisでそれをモデル化する方法を示しています。これらの6つの原則に従って、通常のテーブルと同じように考えることができます。 (もちろん、CRUD、制約、関係など、それほど関連のない概念はありません。)

20
Mehmet Kaplan

単純な場合、Vanilla redisは他の答えは完全に正しいですが、昨日(2016年12月2日)redis 4-rc1がリリースされました。

redis v4はモジュールのサポートを提供し、SQLiteをredis自体に埋め込むための小さなモジュールを作成しました。 rediSQL

そのモジュールを使用すると、redisインスタンス内で完全に機能するSQLデータベースを実際に使用できます。

2
Siscia

searchbox フレームワークを試すことができます。 searchboxは、Criteria apiを使用してredisデータをクエリする簡単な方法を提供します。

0
Tharanga

OnceDBは、Redisに基づく全文検索インメモリデータベースです。 SQLリレーショナルデータベースやNoSQLスキーマレスデータベースなどのデータ管理をサポートしています。

OnceDBはRedisのデータストレージ構造を変更せず、Redisと完全に互換性があります。 Redisデータベースファイルは、OnceDBで直接操作し、Redisに返して使用することができます。

OnceDBは演算子を通じて補助インデックスを自動的に作成します。

= Ordinary field value, no index
@ Primary key
? Grouping index
* Keyword grouping index, separated by ',' between keywords
\ Sort index, the score weight of the index is the value of the field

たとえば、次のコマンドを実行してユーザーデータを追加します。

upsert user username @ dota password = 123456 title ? SDEI skills * Java,go,c
> OK

cキーワードを含むユーザーデータの検索や、ユーザー名とパスワードのフィールドの出力など、演算子を使用してインデックスから検索できます。

find user 0 -1 username = * password = * skills * c
find user 0 -1 username = * password = * skills * c
1) (integer) 1
2) "user:dota"
3) "dota"
4) "123456"
5) "Java,go,c"

続きを読む: OnceDBクイックスタート

0
Kris Zhang

Redis にはいくつかの基本的なデータ構造があり、NoSQLとSQLは異なる世界です。しかし、いくつかの計画されたSQLデータストアのように Redis を使用できます。 SQL経由でRedisを試してみる面白いプログラム Redisqlgithub があり、@ Redisql の背後にあるアイデアは、@ sberryが言及しているようなものです。

0
南山竹