refer:https://blog.youkuaiyun.com/yangshangwei/article/details/113827617
https://artisan.blog.youkuaiyun.com/article/details/113820856
refer:设计参考:https://github.com/jantent/springbootRedis
SpringDataRedis使用Jedis来操作Redis
1、POM依赖
<!-- 实现对 Spring Data Redis 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<!-- 去掉 Lettuce 的依赖-->
<!-- Spring Boot默认集成的是Lettuce作为Redis客户端来操作Redis-Server -->
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 将 lettuce 替换为 Jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- 使用 fastjson 作为 JSON 序列化的工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
<!-- Spring Data Redis 默认使用 Jackson 作为 JSON 序列化的工具 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、配置文件
spring:
# redis的基本配置:
# 对应 RedisProperties 类
redis:
host: 127.0.0.1
port: 6379
password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
database: 0 # Redis 数据库号,默认为 0 。
timeout: 0 # Redis 连接超时时间,单位:毫秒。
# 客户端-连接池配置
# 对应 RedisProperties.Jedis 内部类
jedis:
pool:
max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。
max-idle: 8 # 默认连接数最小空闲的连接数,默认为 8 。使用负数表示没有限制。
min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。
max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。
3、配置类
自定义RedisTemplate
类
package com.artisan.config;
import org.springframework.beans.factory.annotation.Autowired;
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.RedisSerializer;
@Configuration
public class RedisConfiguration {
/**
* 因为在 springoot 2.x版本中,默认采用的是使用Lettuce作为操作redis的客户端。
* 所以springboot的自动化配置是:无法自动的初始化出Jedis的连接对象的,JedisConnectionFactory,
* 所以我们需要手动配置并注入:
* @return
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String,Object> template = new RedisTemplate();
template.setConnectionFactory(jedisConnectionFactory());
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式),
//故pom中需引入json依赖
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域以及修饰符范围
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//如果有这一行配置的话,序列化之后的数据 会有一些额外的类型信息在数据中。可以不进行下面这行配置
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
额外的类型信息如下:
RedisTemplate的配置类中若有如下配置代码,om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
那么存储的数据就会存在类型信息,故一般 不写如下的配置代码。
4、实体类
@Data
public class Person {
private Integer id;
private String name;
}
如何使用RedisTemplate:
@RestController
public class HelloController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/set")
public Object set() {
Person person = new Person();
person.setId(1);
person.setName("lq");
//存值
redisTemplate.opsForValue().set("p1", person);
//取出的值为json对象,将json对象转为对应的json格式的字符串
Object p1 = redisTemplate.opsForValue().get("p1");
String jsonStr = JSONObject.toJSONString(p1);
//将json字符串 解析为对应的对象
Person object = JSONObject.parseObject(jsonStr, Person.class);
return object;
}
@RequestMapping("/set2")
public Object set2() {
Person p1 = new Person();
p1.setId(1);
p1.setName("lq");
Person p2 = new Person();
p2.setId(2);
p2.setName("lq2");
Person p3 = new Person();
p3.setId(3);
p3.setName("lq4");
Person p4 = new Person();
p4.setId(4);
p4.setName("lq4");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
//存储:value为List
redisTemplate.opsForValue().set("ps", list);
//将json对象转为json字符串
String jsonString = JSONObject.toJSONString(redisTemplate.opsForValue().get("ps"));
//将json字符串解析为对应的集合类
List<Person> personList = JSONObject.parseObject(jsonString, new TypeReference<List<Person>>() {
});
return personList;
}
}
注:从redis中取出的数据是JSON类型,需使用fastjson转为json字符串,再转为对应的对象来使用。