Spring Data Redisがデータをキャッシュする場合、redisサーバのKeyの前に特殊文字接頭辞ソリューションがあります

5008 ワード

Springのspring-data-redisパッケージの下にRedisTemplateクラスがあり、testを呼び出すと:
	@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には特殊文字の問題があります