文章目录
- Springboot整合Redis
- 依赖引入
- 配置文件编写
- 编写测试案例,实现数据读写
- 测试
- 保存json格式乱码
- 2021.09.06 问题汇总
Springboot整合Redis
依赖引入
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件编写
此处采取yml
的方式实现配置文件的编写。
server:
port: 80
spring:
redis:
host: 192.168.99.100
port: 10000
password: linkpower
timeout: 10000 #连接超时时间
jedis: ## jedis配置
pool: ## 连接池配置
max-idle: 8 ## 最大空闲连接数
max-active: 8 ## 最大连接数
max-wait: 3000 ## 最大阻塞等待时间
min-idle: 0 ## 最小空闲连接数
很多博客中,都会增加一些别的手动配置类,此处就按照官方定义的yml
方式即可
编写测试案例,实现数据读写
编写一个测试类,简单测试Redis数据的设置和获取操作:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Redis基本使用测试
* @author 765199214
*
*/
@RestController
public class TestController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/setRedis")
public String setRedis(String key,String val) {
//这里是操作String类型,所以是opsForValue
redisTemplate.opsForValue().set(key, val);
//如果是别的类型,可以使用:
// opsForHash hash类型
// opsForList() list类型
// opsForSet() set类型
// opsForZSet() sortedSet类型
return "ok";
}
@RequestMapping("/getRedis")
public String getRedis(String key) {
return (String) redisTemplate.opsForValue().get(key);
}
}
测试
设置数据测试:
获取数据操作:
保存json格式乱码
如下所示:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSONObject;
@RestController
public class RedisJsonController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/setVal")
public String setVal(String key) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", "1");
jsonObject.put("value", "专注写bug测试");
redisTemplate.opsForValue().set(key, jsonObject.toString());
return "ok";
}
}
请求如下连接:
此时Redis中的数据存储如下所示:
请求链接2:
http://localhost/setVal?key=1111
此时Redis中的数据存储如下所示:
此时则需要配置RedisTemplate序列化
问题。
增加配置文件:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
/**
* 重写Redis序列化定义方式,采取json方式————避免json格式乱码
* @param factory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
// 创建json序列化对象
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key序列化String
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置value序列化 json
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
// 设置hash key序列化String
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 设置hash value 序列化json
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
// 初始化redis完成序列化的方法
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
重启服务器,再次请求新链接:
http://localhost/setVal?key=xiangjiao2
完美解决乱码问题。
2021.09.06 问题汇总
服务器正式上线项目出现报错信息,报错如下:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON
由此可知Redis序列化异常,不能读取Json
解决方式:
将上述中的
RedisTemplate
配置中setValueSerializer
进行修改。
原:
RedisTemplate<String, String> template = new RedisTemplate<>();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
更改后:
template.setValueSerializer(new StringRedisSerializer());