二十五、Springboot整合redis及其使用案例

1、添加依赖

		
			org.springframework.boot
			spring-boot-starter-data-redis
		

2、配置

spring:
  redis:
    host: 192.168.10.134
    port: 6379
    #springboot整合 redis,不支持设置密码
	#password: 199266

3、由于Springboot-data-redis帮我们自动装载了RedisTemplate对象,所以我们无需注册该bean

  但是,如果用默认的 RedisTemplate ,那么在序列化存到redis中就会发现,key 就变成了。比如,存之前key为"test" ,进入redis看,key就变成了"\xac\xed\x00\x05t\x00\x04test" 。这与RedisTemplate默认提供的序列化协议有关。为了使其更符合我们的需求,我们需要订制序列化协议。

  这里我们选择Springboot自带的Jackson为序列化协议,具体配置如下:

@Configuration
public class RedisConfiguration {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer 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);

        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

4、仓储接口及其实现
仓储接口

/**
 * 一般用作父类的repository,有这个注解,spring不会去实例化该repository:@NoRepositoryBean
 */
@NoRepositoryBean
public interface UserRepository {
    boolean save(User user);
    User findUser(Long id);
}

仓储实现

@Repository("userRepositoryByRedis")
public class UserRepositoryImplByRedis implements UserRepository {
    /**
     * 注意:redis的自动装载类RedisAutoConfiguration中自动装载的bean为redisTemplate和
     * stringRedisTemplate,若我们想给RedisTemplate加上泛型,比如RedisTemplate,
     * 那么就会注入失败,我们需要为该对象重新注册bean
     */
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public boolean save(User user) {
        try {
            redisTemplate.opsForValue().set(String.valueOf(user.getId()), user);
            return true;
        } catch (Exception e){
            System.out.println(e.toString());
            return false;
        }
    }

    @Override
    public User findUser(Long id) {
        try {
            return (User) redisTemplate.opsForValue().get(String.valueOf(id));
        } catch (Exception e){
            System.out.println(e.toString());
            return null;
        }
    }
}

5、测试

@RestController
@RequestMapping("/user")
public class UserController {
   @Autowired
    @Qualifier("userRepositoryByRedis")
    private UserRepository userRepository;
    
    @PostMapping
    public boolean save(@RequestBody User user){
        return userRepository.save(user);
    }
    @GetMapping("/{id}")
    public User findUser(@PathVariable Long id){
        return userRepository.findUser(id);
    }
}

你可能感兴趣的:(Spring,Boot,从入门到放弃)