本次問題(結(jié)尾解答):
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应闯,實例可以再多個線程中進行共享,不存在線程不安全的情況船万!可以減少線程數(shù)據(jù)骨田。
在pom.xml文件添加依賴:這里我使用的連接池技術(shù)是jedis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 1.5的版本默認采用的連接池技術(shù)是jedis 2.0以上版本默認連接池是lettuce, 在這里采用jedis,所以需要排除lettuce的jar -->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加jedis客戶端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- 將作為Redis對象序列化器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
然后application.properties添加:
(假如redis有密碼的話:自行添加 spring.redis.password=xxxxx)
spring.redis.host=120.25.26.86
spring.redis.port=6379
在service層簡單實現(xiàn)普通添加數(shù)據(jù)進入redis:
public interface RedisService {
void addkey(String key,String value);
}
@Service
public class RedisServiceImp implements RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void addkey(String key,String value) {
redisTemplate.opsForValue().set(key,value);
}
}
在控制層實現(xiàn)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
遇到的問題:
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配置文件:
還不行的話柿冲,看看你的遠程服務(wù)器6379端口有沒有開放。
3.redis有一個問題姻采,就是在存對象的時候,會序列化成2進制文件婚瓜。
原因:
spring-data-redis的RedisTemplate<K, V>模板類在操作redis時默認使用JdkSerializationRedisSerializer來進行序列化
解決:
自定義RestTemplate刑棵,使用GenericJackson2JsonRedisSerializer解決序列化問題巴刻。
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
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();
// 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setEnableDefaultSerializer(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
自定義redisTemple后胡陪,使用自動注入@Autowired即可使用碍舍。