以下是我们RedisConfig的通用模板:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
// 创建模板
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
}
步骤:
- 创建redis模板
- 创建连接工厂
- 设置序列化工具(因为我们在使用redistemplate时会自动把value值序列化为byte类型)
- key和hashkey采用string序列化
- value和hashvalue采用json序列化
当我们不进行编写配置类直接操作redis的时候 eg:
@Test
void testOne() {
redisTemplate.opsForValue().set("name","卷心菜");
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name); //卷心菜
}
问题
问题出现了,当我们使用Redis客户端查看刚刚存入Redis数据库的数据时,结果是这样的:
是因为在使用默认的对象redisTemplate
时,会把value值序列化为byte类型,所以就出现了上图的结果。
问题1
为什么key和hashkey需要采用string的方式序列化,而value和hashvalue需要采用json序列化
在 Redis 中,key 和 value 的序列化方式是可以根据需求进行选择的。使用不同的序列化方式可以带来不同的优势和适用场景。
通常,将 key 采用字符串(string)序列化的原因是因为 key 通常是一个唯一标识符,使用字符串作为 key 的序列化方式可以带来以下优势:
- 简单性:字符串是 Redis 中最常见的数据类型,用于标识和检索数据。通过使用字符串作为 key,可以更直观和简单地操作和管理数据。
- 查找效率:字符串序列化方式不会改变 key 在内存中的存储形式,可以提高查找和匹配的效率。
- 前缀匹配:使用字符串作为 key,可以很容易地进行前缀匹配,以便检索具有相同前缀的多个键。
另一方面,将 value 采用 JSON(JavaScript Object Notation)序列化的原因是因为 JSON 具有以下优势:
- 可读性:JSON 是一种人类可读的数据格式,易于理解和调试。通过使用 JSON 序列化方式,可以在 Redis 存储的数据中保留可读的结构。
- 复杂数据结构支持:JSON 支持复杂的数据结构,例如数组和嵌套的对象。通过将值序列化为 JSON,可以存储和检索更复杂的数据类型。
- 扩展性:JSON 是一种通用的数据格式,可以与多种编程语言和平台进行交互。通过使用 JSON 序列化方式,可以在不同的应用程序之间共享和传输数据。
需要注意的是,选择序列化方式时应综合考虑性能、存储空间、可读性和数据操作的需求。根据项目的具体情况和使用场景,可以选择适合的序列化方式。