我的spring-boot 集成redis(方便自己看)

本次问题(结尾解答):

1.java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x01错误

2.Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause

3.自定义模板,解决序列化问题

正题开始,在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce

jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接
池!
lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据。
在pom.xml文件添加依赖:这里我使用的连接池技术是jedis


            org.springframework.boot
            spring-boot-starter-data-redis
            
            
                
                    io.lettuce
                    lettuce-core
                
            
        
        
        
            redis.clients
            jedis
        
        
        
            com.alibaba
            fastjson
            1.2.47
        

然后application.properties添加:

(假如redis有密码的话:自行添加 spring.redis.password=xxxxx)

spring.redis.host=120.25.26.86
spring.redis.port=6379

在service层简单实现普通添加数据进入redis:

public interface RedisService {
    void addkey(String key,String value);
}



@Service
public class RedisServiceImp implements RedisService {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void addkey(String key,String value) {
        redisTemplate.opsForValue().set(key,value);
    }
}

在控制层实现service操作redis的方法:

@Autowired
    private RedisService redisService;
    @RequestMapping("/redis")
    public @ResponseBody String RedisDemo(@RequestParam String key, String value){
        System.out.println(key);
        System.out.println("进来了");
        redisService.addkey(key,value);
        return "ok";
    }

启动springboot测试一下:

http://localhost:8080/redis?key=hi&value=hi

图片.png

图片.png

遇到的问题:

1.java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x01错误解决
将https://localhost:8080/ 改为http://localhost:8080/

2.Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause
假如引入的依赖没错的话,有可能是你的远程redis的不对外连接,需要修改一下redis配置文件:


图片.png

还不行的话,看看你的远程服务器6379端口有没有开放。

3.redis有一个问题,就是在存对象的时候,会序列化成2进制文件。

原因:
spring-data-redis的RedisTemplate模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化

解决:
自定义RestTemplate,使用GenericJackson2JsonRedisSerializer解决序列化问题。

public class RedisConfig {
 
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate 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);
 
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
 
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
 
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
 
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
 
        redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setEnableDefaultSerializer(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
 
}

自定义redisTemple后,使用自动注入@Autowired即可使用。

你可能感兴趣的:(我的spring-boot 集成redis(方便自己看))