这两台在学习redis,不得不说redis作为非关系型数据库,其功能非常强大,我打算用redis对课程作业的后台进行升级,在一些经常访问的资源使用redis存储在服务器的内存中,当进行查找的时候,如果能使用redis查找到那么就直接返回,否则再使用mysql到数据库中进行查找。redis集成springboot也非常简单,下面记录一下我搭建环境的过程。
1.在pom.xml中加入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.在application.properties中加入连接redis的配置:
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
3.之后就可以进行一些简单的redis操作了
@Autowired
private StringRedisTemplate stringRedisTemplate;
@ResponseBody
@RequestMapping("test")
public String test(){
stringRedisTemplate.opsForValue().set("md","2");
return stringRedisTemplate.opsForValue().get("wxw");
}
但是现在还有一些问题,因为当我们现在向redis存储POJO对象的时候,redis默认是使用JDK的序列化方式,写入redis的都是字节码:
我new一个POJO类,
package com.wxw.myredis;
import java.io.Serializable;
public class User implements Serializable {
private String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
将POJO对象写入redis:
@ResponseBody
@RequestMapping("test")
public String test(){
User user = new User("wxw",19);
redisTemplate.opsForValue().set("POJO",user);
return stringRedisTemplate.opsForValue().get("wxw");
}
得到的结果是这样的:
可见都是字节码,所以接下来
4.实现redis的json序列化:
new一个配置类:
package com.wxw.myredis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
//还是使用springboot默认配置的RedisConnectionFactory
@Autowired
private RedisConnectionFactory redisConnectionFactory;
// 默认用的是用JdkSerializationRedisSerializer进行序列化的
@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate<String, Object> redisTemplate() {
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);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key-value结构序列化数据结构
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// hash数据结构序列化方式,必须这样否则存hash 就是基于jdk序列化的
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
/// redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
重新启动,重新请求url:
redis写入的结果是这样的:
可见实现了json存储。
如果想要取出:
(User)redisTemplate.opsForValue().get("md")