- springboot整合redis教程https://www.jianshu.com/p/fd65156ff630,由此教程无法设置失效时间,需要进行优化
- springboot 自带的 redisTemplate.opsForValue().set() 用来设置键,有四个参数,分别是 key value 失效时间 失效时间格式(分、秒啥的,在idea环境下有提示),但是原生的 redis 操作无法序列化数据,也就是说存入的数据是乱码的,这时我们就用到上面那个教程,改用教程里的redis操作,但是教程redis操作方法只有两个参数,一个key一个value,无法进行失效时间设置,所以需要进行优化
- 进入原生的 redis 操作 redisTemplate.opsForValue().set() 方法里,可以看到有是是三个重载方法
在教程里的是这样的
这个教程里的方法只接受两个参数,序列化后调用原生redis操作,所以我们需要在下面加上四个参数的方法以形成重载。由于教程作者封装好了可以序列化所有数据的方法, 所以我们要重载作者的set方法
设置好以后就可以用了,例如下面
上面的 redisTempleService 是教程里作者封装好了可以序列化任意数据的 service,所以我们设置了key,并传入一个对象,设置时间,设置时间格式,这种存方法完美解决一切问题,不会乱码,json格式也可以直接存入(存入对象即成为json),而下面的是 springboot 原生方法,存在着很多问题,所以还是用现有的轮子比较好。
改过后的代码
package com.server.vue.service;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class RedisTempleService {
@Autowired
StringRedisTemplate stringRedisTemplate;
public <T> boolean set(String key ,T value){
try {
//任意类型转换成String
String val = beanToString(value);
if(val==null||val.length()<=0){
return false;
}
stringRedisTemplate.opsForValue().set(key,val);
return true;
}catch (Exception e){
return false;
}
}
public <T> T get(String key,Class<T> clazz){
try {
String value = stringRedisTemplate.opsForValue().get(key);
return stringToBean(value,clazz);
}catch (Exception e){
return null ;
}
}
@SuppressWarnings("unchecked")
private <T> T stringToBean(String value, Class<T> clazz) {
if(value==null||value.length()<=0||clazz==null){
return null;
}
if(clazz ==int.class ||clazz==Integer.class){
return (T)Integer.valueOf(value);
}
else if(clazz==long.class||clazz==Long.class){
return (T)Long.valueOf(value);
}
else if(clazz==String.class){
return (T)value;
}else {
return JSON.toJavaObject(JSON.parseObject(value),clazz);
}
}
/**
*
* @param Every T values
* @param T 任意类型
* @return String
*/
private <T> String beanToString(T value) {
if(value==null){
return null;
}
Class <?> clazz = value.getClass();
if(clazz==int.class||clazz==Integer.class){
return ""+value;
}
else if(clazz==long.class||clazz==Long.class){
return ""+value;
}
else if(clazz==String.class){
return (String)value;
}else {
return JSON.toJSONString(value);
}
}
/*重载,使之可以设置过期时间*/
public <T> boolean set(String key ,T value,long var3, TimeUnit var5){
try {
//任意类型转换成String
String val = beanToString(value);
if(val==null||val.length()<=0){
return false;
}
stringRedisTemplate.opsForValue().set(key,val,var3,var5);
return true;
}catch (Exception e){
return false;
}
}
}