Redisの基本データ型は、マルチ条件クエリ、全文検索などをサポートしていません。そのため、Redisソースコードを変更し、補助インデックスを介してSQLデータのように使用できるデータベースにRedisを変換しました。
このプロジェクトのホームページはhttps://oncedb.comです。
OnceDBはRedisのデータストレージ構造を変更しません。RedisデータベースファイルはOnceDBで直接操作してから、Redisに返して使用することができます。
インデックス検索
インデックスを作成する
全文検索のパフォーマンスは低くなります。インデックスを作成することでパフォーマンスを向上させることができます。この方法では、インデックス付きフィールドの順序付きリストを作成し、条件付きクエリの実行時にこれらの順序付きリストに対して交差クエリ操作を実行します。
# Create hash data
hmset article:001 poster dota visit 21 key js
hmset article:002 poster dota visit 11 key c
hmset article:003 poster like visit 34 key js
hmset article:004 poster like visit 44 key c
次に、上記のフィールドのインデックスを作成します。重みスコアは次のように設定されます。202000201、時間に関する整数。値は記事のID値です。
# Create indexed
zadd *article.poster:dota 20200201 001 20200201 002
zadd *article.poster:like 20200201 003 20200201 004
zadd *article.key:js 20200201 001 20200201 003
zadd *article.key:c 20200201 002 20200201 004
# "visit" using its value as the weight score
zadd *article.visit 21 001 11 002 34 003 44 004
インデックスによるクエリ
2つのインデックス*article.key:jsと* article.poster:dotaの共通部分を見つけて、それらを*tmp1順序付きリストに格納します。
zinterstore *tmp1 2 *article.key:js *article.poster:dota
> 1
次に、* tmp1は、key=jsおよびposter=dotaの条件を満たすIDセットを格納します。
zrange *tmp1 0 -1
> 001
zrangehmgetコマンドを使用して、対応するHASH値を出力できます。
zrangehmget *tmp1 0 -1 article: key poster
1) 001
2) 40400402
3) js
4) dota
5)
6)
結果は、直接全文検索キー=jsおよびposter=dotaと同じです。
hsearch article:* key = js poster = dota
1) article:001
2) js
3) dota
検索範囲
たとえば、訪問数が20〜30で、key = jsのデータを検索するには、重みを制御することでデータを検索できます。
一時的なインデックスを作成し、*article.visitの重みとkey=jsのデータのみを取得します
zinterstore *tmp2 2 *article.key:js *article.visit weights 0 1
> 2
20〜30のデータを取得します
zrangebyscore *tmp2 20 30
> 001
zrangehmgetbyscoreを使用して、対応するハッシュデータを出力できます。
zrangehmgetbyscore *tmp2 20 30 article: key visit
1) 001
2) 21
3) js
4) 21
5)
6)
結果は、全文検索を使用した結果と一致しています。
hsearch article:* visit >= 20 visit <= 30 key = js
1) article:001
2) 21
3)
4) js
同一のフィールドが2つあるため、visit> = 20 visit <= 30の場合、検索結果には1つしか出力されず、3行目の繰り返しフィールドには空が出力されます。
その他のOnceDB拡張命令を表示できます:OnceDBでの命令の検索、クエリ、計算、および合計
自動インデックス作成
Redisインデックスの作成と保守はあまり便利ではありません。OnceDBは、データが変更されたときに補助インデックスを自動的に作成することを選択できます。
インデックスの作成:スキーマフィールドの演算子値をアップサート..。
upsert / insert / updateディレクティブと特殊演算子を使用して、インデックスを自動的に作成します。
上記の例は次のように書くことができます:
upsert article id @ 001 poster ? dota visit / 21 key ? js
upsert article id @ 002 poster ? dota visit / 11 key ? c
upsert article id @ 003 poster ? like visit / 34 key ? js
upsert article id @ 004 poster ? like visit / 44 key ? c
オペレーター:
@:主キー?:グループインデックス/:ソートインデックス
インデックスは、操作後に自動的に作成されます。* article * article.poster:dota * article.poster:like * article.visit * article.key:js * article.key:c
マルチコンディションインデックスクエリ:スキーマを検索してからフィールドオペレータ値まで..。
インデックスのあるフィールドの場合、findコマンドを使用してインデックスフィールドをクエリできます。たとえば、クエリ:key=jsおよびposter=dotaのデータ。「?」が使えます これらの2つのフィールドがグループ化されたインデックスであることを示すには:
find article 0 -1 key ? js poster ? dota
1) 1
2) article:001
3) js
4) dota
1はデータの総量を表します。-1の場合は、全文検索が使用されており、パフォーマンスが低下していることを意味します。
インデックス範囲クエリ
@を追加してインデックス範囲を指定し、+を使用してスコアの重み範囲に使用するインデックスフィールドを指定できます。
find article 0@20 -1@30 key ? js visit /+ *
1) 1
2) article:001
3) js
4) 21
インデックスを削除
OnceDBはインデックス定義を保存しません。削除するときは、どのフィールドにインデックスが含まれているかを手動で指定する必要があります。フィールド名とインデックス演算子を指定する必要があります。
remove article @ 001 key ? poster ? visit /
インデックス名とウェイトスコアをカスタマイズすることもできます。詳細な手順については、「OnceDBデータの変更とクエリのヘルプドキュメント」を参照してください。