4

次のコード例は、Python REPL と redis-cli を介して作成/作成されます。

Redis サーバー v=2.8.4

バックグラウンド: 長期間実行されるキー (ハッシュ) を redis キー値ストアに格納し、同じキー値ストアに別のキー (名前は同じだが型は異なる文字列) を格納しようとしています。

コードが最初に来て、次に質問があります:

>>> import redis

>>> db = redis.Redis(
...     host='127.0.0.1',
...     port=6379, 
...     password='',
...     db=3)

>>> db.hset("123456", "field1", True)
1

>>> db.type("123456")
b'hash'

>>> db.hgetall("123456")
{b'field1': b'True'}

>>> db.set("123456", "new-value")
True

>>> db.type("123456")
b'string'

>>> db.get("123456")
b'new-value'

SET オプションが HSET を上書きすることに最初に気付くでしょう。今、SETを次のように上書きしようとすると:

>>> db.lset("123456", "list1",  "list1value")
Traceback (most recent call last):
  ...
redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value
WRONGTYPE Operation against a key holding the wrong kind of value

または、SET を同じ HSET に置き換えます。

>>> db.hset("123456", "field1", True)
Traceback (most recent call last):
  ...
redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value
WRONGTYPE Operation against a key holding the wrong kind of value

これが redis-py の欠陥でないことを確認するために、redis-cli でテストしました。

127.0.0.1:6379> HSET 12345 "field" "value1"
(integer) 0
127.0.0.1:6379> TYPE 12345
hash
127.0.0.1:6379> SET 12345 "newvalue"
OK
127.0.0.1:6379> TYPE 12345
string
127.0.0.1:6379> HSET 12345 "field" "value1"
(error) WRONGTYPE Operation against a key holding the wrong kind of value

質問:

1) これは Redis の欠陥ですか、それとも実際に動作するはずの方法ですか?

2)これが「どのように機能するか」である場合、SETタイプを他のタイプで上書きできないのはなぜですか?

**編集:質問に答える人が理解できなかったので3)..私はそれを編集しています

3) SET 以外に、STRING を構造体 (KEY, VALUE) に格納するために使用できる他のタイプはどれですか。ここでは、HASH を (KEY, FIELD, VALUE) としても使用できます。キーは同じですが、TYPE( s)?

例えば。私はやってみたいです:

127.0.0.1:6379> HSET 12345 "field" "value1"
(integer) 0
127.0.0.1:6379> TYPE 12345
hash
127.0.0.1:6379> SOME-COMMAND 12345 "newvalue"
OK

同じ「キー」の1つのハッシュと1つの「その他の」タイプがあるように12345

4

1 に答える 1

3
  1. これは設計された動作SETです。 のドキュメントの 2 番目の文は次のとおりです。

キーがすでに値を保持している場合は、その型に関係なく上書きされます。

  1. いいえ、SETその力しかありません。他のコマンドは、間違ったタイプの値が提示されるとエラーになります。

  2. 申し訳ありませんが、あなたをフォローしていません。

于 2016-12-23T02:44:50.133 に答える