Сегодня я поделюсь вопросом о RedisTemplate.Если вам интересно, вы можете продолжить его читать.Если вам не интересно, продолжайте флиртовать с девушками!
Как показано ниже: друг дал мне изображение ошибки, почему я не могу получить значение?
Я также был немного смущен.Первой реакцией было, будут ли RedisTemplate и StringRedisTemplate использовать два разных Connections, чтобы можно было найти один из одинаковых Keys, а другой не мог быть найден.
После повторного подтверждения Соединение проходит без проблем, оно такое же, или та же самая фраза:За каждым странным вопросом должна стоять история.
Я могу только отлаживать исходный код, что еще я могу сделать. Наконец, была обнаружена проблема в redis.clients.jedis.BinaryJedis#hget, то есть Redis вообще не возвращал данные.
Теперь остается вопрос, почему запрос StringRedisTemplate может возвращать данные, а запрос RedisTemplate — нет?
Повторим связь между StringRedisTemplate и RedisTemplate: StringRedisTemplate наследует RedisTemplate и специально используется для операций со строками.
RedisTemplate обычно используется для более сложных операций с объектами, разница заключается в сериализации.
Поэтому я использовал клиент Redis для проверки формата сохраненных данных и обнаружил, что формат Hash — это строка.
Вот почему для его получения можно использовать StringRedisTemplate, и предполагается, что StringRedisTemplate используется при сохранении.
Метод сериализации RedisTemplate по умолчанию — сериализация JDK, которая имеет неправильный формат.
Поэтому я проверил метод построения RedisTemplate и обнаружил, что метод сериализации несовместим.
Поэтому измените jdkSerializationRedisSerializer на stringSerializer. Повторно запустите тест, и он все еще не работает. Итак, я просмотрел информацию об объекте RedisTemplate следующим образом:
ЗначениеSerializer было изменено, но хэш имеет специальную сериализацию, которая по-прежнему является JDK.
Затем измените все на то же самое, как показано ниже:
Тогда вы можете получить его.Лично я чувствую, что это все еще проблема использования.Может быть, все думают, что два RedisTemplates одинаковы, и нет никакой разницы, поэтому это приводит к проблеме в этой статье.
Если вы достаточно внимательны, то сможете увидеть разницу между этими двумя классами, взглянув на исходный код.
При построении StringRedisTemplate для всех методов сериализации по умолчанию устанавливается значение String, что означает, что формат данных StringRedisTemplate — String.
Если RedisTemplate не установлен, это все JDK.
Если вам интересно, вы можете подписаться на мой публичный аккаунт в WeChat.обезьяний мир, читать больше технических статей в первый раз. У меня также есть открытый исходный код на моем GitHub.github.com/yinjihuan