SpringのRedisTemplateに格納されているkeyとvalueには特殊文字の問題があります
1350 ワード
Springのspring-data-redisパッケージの下にRedisTemplateクラスがあります.呼び出し時:
メソッドの後、Redisに実際に保存されているkeyは、私たちが予め設定したkey値に完全に等しいのではなく、key値の前に特殊な文字を追加します.
"\xac\xed\x00\x05t\x00\x0cTEST"
保存されたvalueは次のようになります.
"\xac\xed\x00\x05t\x00\x10cABCD"
冒頭にはxacxedx 00x 05 tx 00x 0 cのような特殊文字があります.
この特殊文字が登場した理由は、RedisTemplateがJdkSerializationRedisSerializerをシーケンス化ツールとしてデフォルトで使用しているためです.
保存されたkeyは私たちが想像していたのとは違いますが、呼び出しには影響しません.
前に設定したvalueを取得し、得られたvalueも正しいので、特殊文字は付きません.
これは,RedisTemplateがクエリ用のkey値を同じシーケンス化してクエリを行うため,そのレコードを見つけることができ,valueを逆シーケンス化して返すことで,特殊文字のないvalueが得られるはずである.
保存したkeyとvalueにこの特殊な文字を含めたくない場合は、次のコードを使用してシーケンス化方法を手動で変更できます.
メソッドの前の@Autowired注記は追加する必要があります.
以上
redisTemplate.opsForValue().set("TEST","ABCD");
メソッドの後、Redisに実際に保存されているkeyは、私たちが予め設定したkey値に完全に等しいのではなく、key値の前に特殊な文字を追加します.
"\xac\xed\x00\x05t\x00\x0cTEST"
保存されたvalueは次のようになります.
"\xac\xed\x00\x05t\x00\x10cABCD"
冒頭にはxacxedx 00x 05 tx 00x 0 cのような特殊文字があります.
この特殊文字が登場した理由は、RedisTemplateがJdkSerializationRedisSerializerをシーケンス化ツールとしてデフォルトで使用しているためです.
保存されたkeyは私たちが想像していたのとは違いますが、呼び出しには影響しません.
redisTemplate.opsForValue().get("TEST");
前に設定したvalueを取得し、得られたvalueも正しいので、特殊文字は付きません.
これは,RedisTemplateがクエリ用のkey値を同じシーケンス化してクエリを行うため,そのレコードを見つけることができ,valueを逆シーケンス化して返すことで,特殊文字のないvalueが得られるはずである.
保存したkeyとvalueにこの特殊な文字を含めたくない場合は、次のコードを使用してシーケンス化方法を手動で変更できます.
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
メソッドの前の@Autowired注記は追加する必要があります.
以上