SpringBoot集成Redis与自定义RedisTemplate<String,Object>

废话不多说,直接上料~

搭建boot环境(此步骤省略,自行百度)

我这里boot的版本是2.2.13.RELEASE

pom依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

这里需要注意,boot2.x之后,redis底层不再是jedis,而是lettuce。我在demo测试的时候:

报错Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig!

所以需要添加commons-pool2依赖。

配置yml中的redis

spring:
  application:
    name: boot-test
  redis:
    database: 0
    host: 127.0.0.1
    lettuce:
      pool:
        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
      shutdown-timeout: 100ms
    password: ''
    port: 6379

这里为了体现lettuce,所以加了其连接池,正常做单机测试,只写host,port,database就可以了,而且查阅源码,如果默认的localhost,可以不写。

创建《String,Object》类型的自定义RedisTemplate模板

如果你使用的类型为《String,String》,那么可以直接使用StringRedisTemplate就可以了,这是封装好的,直接使用。

    @Autowired
    StringRedisTemplate redisTemplate;

    redisTemplate.opsForValue().set("String-key", "String-value");
    log.info("输出value为: {}",redisTemplate.opsForValue().get("String-key"));
    

对于自定义模板,这里在启动器里注入,和自己写一个configuration类道理一样.
大致进行一个解释说明:
因为RedisTemplate默认给的是《Object,Object》,在我们使用的时候不是很方便,所以一般都自定义《String,Object》模板,这里同时设置了序列化,将value的Object序列化原本由JDK改为jackson序列化。
所有的key由StringRedisSerializer序列化。

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
    
    
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        
        //key
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        
        //value
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

至此,完成对RedisTempalte<String,Obecjt>自定义模板的配置。
注意:非spring注入使用RedisTemplate,需先调用afterPropertiesSet()方法

test测试

这里首先需要对User实体进行序列化,不然会没有序列化的错:

Failed to serialize object using DefaultSerializer;
 nested exception is java.lang.IllegalArgumentException: **DefaultSerializer requires a Serializable payload but received an object of type [com.sk.user.entity.User]**

简单的一个service业务类

@Service
@Slf4j
public class UserServiceImpl implements UserService {
    
    

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public User findById(Integer id) {
    
    
        User user=userMapper.findById(id);
        redisTemplate.opsForValue().set("user",user);
        log.info("---获取redis中的user内容---   {}",redisTemplate.opsForValue().get("user"));
        return user;
    }

输出的结果
redis中查看,也正常显示:
redsi-cli查询结果

至此完成所有操作。

猜你喜欢

转载自blog.csdn.net/qq_38653981/article/details/116192760