目录
3.1 配置文件application.properties
5 SpringDataRedis以JSON格式存储实体对象
1 简介
Spring Data Redis 是属于 Spring Data 下的一个模块。作用就是简化对于 redis 的操做
2 主要源码
2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<groupId>cn.jzh</groupId>
<artifactId>maven_jsp_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- springboot 启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springdata redis jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--测试方法-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- springboot热部署配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 Spring Data Redis的配置类
注意: 必须对redis的键和值进行序列化操作
比如:在同一个方法中先set,再get,正常获得数据,但是,在不同的方法中 先set,再get获取不到数据,通过redis的monitor监控发现了命令的问题:实际执行的命令多了好多其他字符,就是序列化问题导致的,springdataredis里面必须对对象进行序列化处理,否则会报错,而且怎么序列化存储的也要怎么序列化取出
package cn.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfig {
/**
* 创建jedispoolredis对象
*/
@Bean
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数
config.setMaxIdle(10);
//最小空闲数
config.setMinIdle(5);
//最大链接数
config.setMaxTotal(20);
return config;
}
/**
* 创建jedisConnectionFactory:配置redis连接信息
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config){
JedisConnectionFactory factory = new JedisConnectionFactory();
//配置连接信息
factory.setPoolConfig(config);
//配置redis主机host
factory.setHostName("192.168.126.133");
factory.setPort(6379);
return factory;
}
/**
* 创建RedisTemplate:用于执行Redis操作的方法
*/
/* 在同一个方法中
1.先set,再get,正常获得数据。
在不同的方法中 先set,再get获取不到数据,通过redis的monitor监控发现了命令的问题:
实际key为JK_HASH:csrk,hashkey为user,实际执行的命令多了好多其他字符,就是序列化问题导致的
springdataredis里面必须对对象进行序列化处理,否则会报错
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(@Qualifier("jedisConnectionFactory") JedisConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//为key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}
2.3 测试类
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes= APP.class)
public class TestRedis {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 添加字符串
*/
@Test
public void testSet(){
redisTemplate.opsForValue().set("temo","测试redis");
}
/**
* 获取字符串
*/
@Test
public void tesGet(){
String str = (String)redisTemplate.opsForValue().get("temo");
System.out.println(str);
}
}
3 提前redis的参数为配置文件
在 src/main/resource/ 目 录 下 新 建 一 个 配 置 文 件:application.properties
3.1 配置文件application.properties
spring.redis.pool.max-idle=10
spring.redis.pool.min-idle=5
spring.redis.pool.max-total=20
spring.redis.hostName=192.168.70.128
spring.redis.port=6379
3.2 修改配置类
@Configuration
public class RedisConfig {
/**
* 1.创建JedisPoolConfig对象。在该对象中完成一些链接池配置
* @ConfigurationProperties:会将前缀相同的内容创建一个实体。
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis.pool")
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig config = new JedisPoolConfig();
/*//最大空闲数
config.setMaxIdle(10);
//最小空闲数
config.setMinIdle(5);
//最大链接数
config.setMaxTotal(20);*/
System.out.println("默认值:"+config.getMaxIdle());
System.out.println("默认值:"+config.getMinIdle());
System.out.println("默认值:"+config.getMaxTotal());
return config;
}
/**
* 2.创建JedisConnectionFactory:配置redis链接信息
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis")
public JedisConnectionFactory jedisConnectionFactory (JedisPoolConfig config){
System.out.println("配置完毕:"+config.getMaxIdle());
System.out.println("配置完毕:"+config.getMinIdle());
System.out.println("配置完毕:"+config.getMaxTotal());
JedisConnectionFactory factory = new JedisConnectionFactory();
//关联链接池的配置对象
factory.setPoolConfig(config);
//配置链接Redis的信息
//主机地址
/*factory.setHostName("192.168.70.128");
//端口
factory.setPort(6379);*/
return factory;
}
/**
* 3.创建RedisTemplate:用于执行Redis操作的方法
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(@Qualifier("jedisConnectionFactory") JedisConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//为key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}
4 SpringDataRedis操作实体对象
4.1 实体对象,注意序列化
public class Users implements Serializable {
private Integer id;
private String userName;
private Integer age;
//省去getset方法
@Override
public String toString() {
return "Users{" +
"id='" + id + '\'' +
", userName='" + userName + '\'' +
", age='" + age + '\'' +
'}';
}
}
4.2 测试代码
注意:此处可以修改redis值序列化为对象序列化,也可以不用,但是报错了,就试试对象序列化
@Test
public void testSetUsers(){
Users u = new Users();
u.setAge(20);
u.setId(12);
u.setUserName("张三丰");
//重新设置序列化器是把二进制以字符串的形式存储
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.opsForValue().set("user12", u);
}
@Test
public void testGetUsers(){
//重新设置序列化器,是把二进制以字符串的形式反序列化出来
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
Users u = (Users)redisTemplate.opsForValue().get("user12");
System.out.println(u);
}
5 SpringDataRedis以JSON格式存储实体对象
注意:json序列化存储时,若取出也应该用json样式反序列化才能取出
@Test
public void setJson(){
Users users = new Users();
users.setAge(20);
users.setUserName("李四丰");
users.setId(1);
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Users.class));
redisTemplate.opsForValue().set("user_json", users);
}
@Test
public void getJson(){
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Users.class));
Users u = (Users)redisTemplate.opsForValue().get("user_json");
System.out.println(u);
}