文章目录

  • 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);
	}
}

测试

设置数据测试:

http://localhost/setRedis?key=xiangjiao&val=bananaredis显示 redis显示乱码_数据库

获取数据操作:

http://localhost/getRedis?key=xiangjiaoredis显示 redis显示乱码_spring_02

保存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";
	}
}

请求如下连接:

http://localhost/setVal?key=xiangjiao

此时Redis中的数据存储如下所示:

redis显示 redis显示乱码_spring_03


请求链接2:

http://localhost/setVal?key=1111

此时Redis中的数据存储如下所示:

redis显示 redis显示乱码_redis_04

此时则需要配置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

redis显示 redis显示乱码_spring_05

完美解决乱码问题。

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());