2017-11-24 6 views
2

文字列を格納し、それぞれに固有の整数を関連付ける必要があります。整数は可能な限り短く/小さくする必要があります。それはレディスで可能ですか?基本的にはSADDのようなものが必要ですが、セットの要素の数を返す代わりに、挿入された要素のインデックス(新しく格納されたものまたは既存のもの)を返す必要があります。値のインデックスを取得する方法はありますか?

擬似コード:

// if mystring already exists in myset it returns its index 
// otherwise stores it and returns its index. 
    index := storeOrReturnIndex(myset, mystring) 
+0

整数はどれくらいの大きさですか? 8ビット以上の長さ? 16? 128? – Alexander

+0

できるだけ短いので、私は彼らが増分であるべきだと思うのです。私は一種の短いURLサービスを構築していますが、できるだけ短い文字列を使用しています。 – Books

答えて

0

は、あなたが探しているものをハッシュマップのカバーを使用してますか?

> HSET hashmap 0 "first string" 
(integer) 1 
> HSET hashmap 1 "second string" 
(integer) 1 
> HSET hashmap 2 "third string" 
(integer) 1 
> HGET hashmap 1 
"second string" 
> HLEN hashmap 
3 

あなたが持つキーで最後に変更されたインデックスを格納することができます:

> SET last_modified 1 

その後でそれを取得:アトミック新しいを取得する

> GET last_modified 
+0

私はこれをトランザクションで実行する必要があると思います。それ以外の場合は、古いデータを使用することができます。これは、トランザクションの古典的な使用例です。 – Books

+0

実際には、発生する可能性の低い文字列をフィールド名として使用して(通常は空の文字列を使用して)、同じHash内にカウンタを格納できます。これにより、トランザクションが単一のキーに触れるとき(そして 'HINCRBY'コマンドもあります)、トランザクションをより簡単に行うことができます。 は、キー/フィールドを1で初期化する必要はありません。これは、Redisが(0に設定して)行うためです。 I –

+0

'MULTI'コマンドを使用すると、コマンドをまとめてトランザクションとして実行できます。 https://redis.io/topics/transactions – Alexander

0

あなたはRedisのINCRコマンドを使用することができます、ユニークなインデックス。

パターン:カウンター

カウンターパターンでは、Redisのアトミックインクリメント操作で行うことができます最も明白なことです。考えられるのは、操作が発生するたびに、コマンドをRedisに送信するだけです。たとえば、Webアプリケーションでは、このユーザーが毎年何ページ閲覧したかを知りたい場合があります。 これを行うには、ユーザーがページビューを実行するたびにWebアプリケーションがキーをインクリメントし、User IDを連結したキー名と現在の日付を表す文字列を作成します。 この単純なパターンは、多くの方法で拡張することができます。

ですから、新しいアイテム(URL)を保存したい場所に、原子方法で次のユニークな、最小のインデックスを取得するにはINCRを使用しています。次に、HSETを使用してアイテムに関連付けられたインデックスを格納し、HGETを使用してアイテムの関連インデックスを取得できます。

関連する問題