Redis系列文章------11.自定义RedisTemplate(自定义Redis配置类)

原创:兜里的猫

本章目录

  • 创建RedisConfig配置类
  • 编写RedisTemplate方法
  • 解决序列化问题
  • RedisUtil 工具类

1. 创建RedisConfig配置类

新建一个 RedisConfig 类,加上 @Configuration 注解,标注其为配置类即可。

/**
 * Redis配置类
 * Created by ASUS on 2020/4/28.
 */
@Configuration
public class RedisConfig {
// 编写我们自定的 redisTemplate 

}

2. 编写RedisTemplate方法

/**
 * Redis配置类
 * Created by ASUS on 2020/4/28.
 */
@Configuration
public class RedisConfig {
// 编写我们自定的 redisTemplate (解决序列化问题)
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    RedisTemplate<String, Object> template = new RedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

}

3. 解决序列化问题

1.首先我们新建一个User对象,用redis来操作对象。

User.java(该对象没有实现序列化)

@Component          // 注册成组件,方便直接使用
@AllArgsConstructor // 创建有参构造函数
@NoArgsConstructor  // 创建无参构造函数
@Data               // 创建get、set方法
public class User {
private String name;
private Integer age;

}

2.当我们直接传入没有进行序列化操作的user对象时,程序运行会报错。

redis
redis

3.我们可以使用 fastjson 的 ObjectMapper 对 user 进行序列化,然后 redis 操作序列化后的 user 对象即可。

redis
redis

4.或者在user对象中实现 Serializable 接口 (推荐)

@Component          // 注册成组件,方便直接使用
@AllArgsConstructor // 创建有参构造函数
@NoArgsConstructor  // 创建无参构造函数
@Data               // 创建get、set方法
public class User implements Serializable {
private String name;
private Integer age;

}

代码中直接传入user对象即可,或者转为json对象再传入亦可!

在实际的开发项目中,我们所有的 entity 都会序列化!

redis
redis

5.RedisConfig 序列化配置

/**
 * Redis配置类
 * 这是一个固定模板,项目中使用到redis的,都可以直接拿去使用!
 * Created by ASUS on 2020/4/28.
 */
@Configuration
public class RedisConfig {
// 编写我们自定的 redisTemplate (解决序列化问题)
@Bean
@SuppressWarnings("all") // 忽略编译后的警告信息
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    // 为了开发方便,一般直接使用 <String, Object>
    RedisTemplate<String, Object> template = new RedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);

    // JSON序列化配置
    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    // String序列化配置
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

    // key采用string的序列化方式
    template.setKeySerializer(stringRedisSerializer);
    // hash的key也采用string的序列化方式
    template.setHashKeySerializer(stringRedisSerializer);
    // value采用jackson的序列化方式
    template.setValueSerializer(jackson2JsonRedisSerializer);
    // hash的value也采用jackson的序列化方式
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();

    return template;
}

}

然后在使用 RedisTemplate 时,需要注意:

@Autowired
@Qualifier("redisTemplate")
// 这里RedisTemplate 有2个实现类:系统默认的实现类和我们自定义的实现类,
// 使用 @Qualifier 注解指明使用我们自定义的实现类
private RedisTemplate redisTemplate;

现在再来测试redis操作:

@RequestMapping("/testSerializable")
public String testSerializable() throws JsonProcessingException {
    // 正常的开发项目中都是使用json传递对象
    User user = new User("我是好人", 16);
System.out.println(redisTemplate.opsForValue().get("user"));

return redisTemplate.opsForValue().get("user").toString();

}

输出结果:

User(name=我是好人, age=16)

然后这时我们用命令行查看存入的key就已经被序列化存入了。

127.0.0.1:6379> keys *
1) "user"

小结:

到这里,我们就明白了:

为什么要自定义redis配置类? 是为了重新定义 RedisTemplate。

如何解决存入的key被转义?需要在 RedisTemplate 中进行 key、value 的序列化配置。

4. RedisUtil 工具类

开发中,Springboot中操作redis不可能都是操作原生api,这样开发效率太低了,往往都是封装成工具类在项目中使用。就像操作jdbc一样,需要封装成JDBCUtil。

RedisUtil
RedisUtil

++RedisUtil 工具类的代码较多,由于篇幅过长,我在文章中就不直接将代码贴出来了,有需要的评论区留言获取。++

其实所有的 redis 操作,对于各位程序员来说十分简单。更重要的是要去理解redis的思想和每一种数据类型的用处和使用场景!

小程序码【兜里的猫】

小程序码

欢迎访问博客网页版:www.wldeer.com
关注公众号:(同步更新)【FreeWeb开发者】
# Redis 

评论

稻城 : 111
兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×