Spring Data Redisがデータをキャッシュする場合、redisサーバのKeyの前に特殊文字接頭辞ソリューションがあります
5008 ワード
Springのspring-data-redisパッケージの下にRedisTemplateクラスがあり、testを呼び出すと:
メソッドの後、Redisに実際に保存されているkeyは、私たちが予め設定したkey値に完全に等しいのではなく、key値の前に特殊な文字を追加しました.
冒頭にはxacxedx 00x 05 tx 00x 12のような特殊文字があります.
この特殊文字が登場した理由は、RedisTemplateがJdkSerializationRedisSerializerをシーケンス化ツールとしてデフォルトで使用しているためです.
保存されたkeyは私たちが想像していたのとは違いますが、呼び出しには影響しません.
これは,RedisTemplateがクエリ用のkey値を同じシーケンス化してクエリを行うため,そのレコードを見つけることができ,valueを逆シーケンス化して返すことで,特殊文字のないvalueが得られるためである.
保存したkeyとvalueにこの特殊な文字を含めたくない場合は、シーケンス化方法を変更して、テストクラスで次のコードを使用します.
参考記事
SpringのRedisTemplateに格納されているkeyとvalueには特殊文字の問題があります
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test(){
redisTemplate.opsForSet().add("ezblockword-backup","hello");
Set<String> sGet=redisTemplate.opsForSet().members("ezblockword-backup");
for (String item:sGet){
System.out.println(item);
}
}
メソッドの後、Redisに実際に保存されているkeyは、私たちが予め設定したkey値に完全に等しいのではなく、key値の前に特殊な文字を追加しました.
冒頭にはxacxedx 00x 05 tx 00x 12のような特殊文字があります.
この特殊文字が登場した理由は、RedisTemplateがJdkSerializationRedisSerializerをシーケンス化ツールとしてデフォルトで使用しているためです.
保存されたkeyは私たちが想像していたのとは違いますが、呼び出しには影響しません.
"\xac\xed\x00\x05t\x00\x12ezblockword-backup"
は、以前に設定された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;
}
参考記事
SpringのRedisTemplateに格納されているkeyとvalueには特殊文字の問題があります