Redis を使用してエンティティのキャッシュ データを保存しようとしています。エンティティにはさまざまな種類のフィールドがあります。たとえば、
public class Job {
private String id;
private Date createTime; //Long
private String submitterName;
private JobDefinition jobDef; //Another class
}
より多くのフィールドがあり、いくつかのフィールドは他のフィールドよりも頻繁に更新されるため、これjob
を各フィールドをキーとして Redis の Hashmap として保存することにしました。ここでは、入れ子になったオブジェクト likejobDef
は重要ではないので、for を使用Jackson2JsonRedisSerializer
するhashValueSerializer
とRedisTemplate
、jobDef
obj は長い JSON 文字列としてシリアル化されるだけで、私の場合はまったく問題ありません。
job
しかし、Redis からオブジェクト全体を効果的に逆シリアル化する方法がわかりません。私がデシリアライザーに設定したタイプは似Jackson2JsonRedisSerializer(Map.class)
ていますが、文字列のキーと値をデシリアライズするときに文句を言います。
これは無効な使用法RedisTemplate
ですか、それともシリアライザーをどのように構成する必要がありますか?
編集:コードの詳細を追加し、
@Autowired
private StringRedisTemplate redisTemplate; //Here I'm using a String template as I need to use the same redisTemplate for some key-value/list operations too
Map jobHash= new ObjectMapper().convertValue(job, Map.class);
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer(Map.class));
redisTemplate.opsForHash().putAll("job:"+job.getId(), jobHash); //After this the job hash shows up in Redis as I expected, while the jobDef member is serialized and saved as a JSON string
Map jobMap = redisTemplate.opsForHash().entries("job:" + job.getId()); //But this won't work as it'll throw exception complaining cannot deserialize a String value to Map. But when I set Jackson2JsonRedisSerializer(String.class) it throws exception that cannot resolve the byte code
2回目の編集:
JdkSerializationRedisSerializer
HashValueSerializer として使用すると、逆シリアル化は正常に機能しRedisTemplate
ますが、これを使用する場合の欠点は、Redis に格納されている値が、 を使用した場合と同じ人間が読み取れる文字列値ではないことJackson2JsonRedisSerializer
です。