前言
项目中的缓存,目前使用最广泛的缓存数据库,我想就是redis了,redis作为一个基于内存的非关系型数据库,实现了分布式部署,实现了数据持久化,具有高可用,高性能的特点。本项目使用了springboot框架,集成了redis进行简单的使用,并配置自己的RedisTemplate,SpringBoot连接redis有默认的生态,连接成功后我们一般适应RedisTemplate对象来操作redis,RedisTemplate直接加入在spring的生态环境当中,我们在springboot项目中可以直接注入使用。但是springboot连接redis的默认RedisTemplate是RedisTemplate<Object,Object>,默认的序列化方式满足不了我们的使用,我们希望将在java代码里面的代码的对象存入redis时,使用的是json字符串的格式存储在redis中,而不是一串谁都看不懂的二进制码,在读取的时候可以直接使用java中的对象接收,redis中存储的字符串。
项目架构
项目jar包引入
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--原生redis连接包-jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<!--redis集成springboot的配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--序列化配置包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!--使用lettuce连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
项目配置
# 应用名称
spring.application.name=redis
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.44.128
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=1000
springboot自我实现连接redis的jar包,直接加入使用即可,值得注意的是,springboot连接jar的底层连接池,在当前版本较高的springboot项目,redis连接池我们有2种选择,jedis和lettuce
集成redis
1.创建redis配置类-RedisConfiguration
重新注入自己的模板
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
//连接redis模板
RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
template.setConnectionFactory(factory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//加入自己的序列化方式
FastJson2JsonRedisSerializer fastJsonRedisSerializer = new FastJson2JsonRedisSerializer(Object.class);
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
return template;
}
}
2.使用fastjson创建自己的序列化方式,上一个类需要使用到-FastJson2JsonRedisSerializer
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Class<T> clazz;
public FastJson2JsonRedisSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
//加入本配置,否则在解析的时候会报错
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
if (bytes == null || bytes.length <= 0) {
return null;
}
String str = new String(bytes, DEFAULT_CHARSET);
return (T) JSON.parseObject(str, clazz);
}
}
3.测试使用-RedisService
@Service
public class RedisService {
private Logger logger = LoggerFactory.getLogger(RedisService.class);
@Autowired
private RedisTemplate<String,Object> redisTemplate;
public void setString(){
User user = new User();
user.setPassword("123");
user.setUsername("swj");
redisTemplate.opsForValue().set("mystringkey",user);
User ss = (User) redisTemplate.opsForValue().get("mystringkey");
logger.info("String测试:{}",ss.toString());
}
}