次のコード例は、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