文章目录
自定义RedisUtil工具类,不使用RedisTemplate的原生方法,而是自己根据RedisTemplate中的原生方法进行封装,创造出新的方法
1.RedisUtil工具类的样貌
工具类的大致样貌如下图:
2.RedisUtil工具类的一些常见方法的代码
@Component
public class RedisUtil {
@Autowired
@Qualifier("redisTemplate2")
private RedisTemplate<String,Object> redisTemplate;
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
* */
public boolean expire(String key,long time){
try{
if(time>0){
redisTemplate.expire(key,time, TimeUnit.SECONDS);
}
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* 根据key获取过期时间
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
* */
public long getExpire(String key){
return redisTemplate.getExpire(key,TimeUnit.SECONDS);
}
/**
* 判断key是否存在
* @param key 键
* @return true 存在 false不存在
* */
public boolean hasKey(String key){
try{
redisTemplate.hasKey(key);
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* 普通缓存获取
* @param key 键
* @return 值
* */
public Object get(String key){
return key==null?null:redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
* @param key 键
* @param value 值
* @return true成功 false失败
* */
public boolean set(String key,Object value){
try{
System.out.println("---------------================"+redisTemplate);
redisTemplate.opsForValue().set(key,value);
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false失败
* */
public boolean set(String key,String value,long time){
try{
if(time>0){
redisTemplate.opsForValue().set(key,value,time,TimeUnit.SECONDS);
}else{
set(key,value);
}
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
}
3.测试RedisUtil工具类,以及一个非常难调的空指针错误
为什么RedisUtil工具类中的redisTemplate对象的值会是null呢?我们明明已经使用@Autowired和@Qualifier(“redisTemplate2”)这两个注解把Spring的IOC容器中的redisTemplate对象注入到了RedisUtil工具类的redisTemplate对象中了啊?
紧着我们把单元测试中RedisUtil对象的创建方式改变一下,又原来的new RedisUtil();变成直接从IOC容器中获取,如下图:
为什么把new一个新的对象改成从IOC中引入的时候,空指针错误就会消失?
如果你出现了这个错误,说明你对SpringIOC的理解还不够深刻,因为当你new一个RedisUtil对象的时候,不是从SpringIOC容器中获取,是直接创建一个新的对象,但是RedisUtil工具类中的redisTemplate对象是从SpringIOC容器中引入的,这样就会导致redisTemplate对象不能从SpringIOC容器中引入进来,所以会出现redisTemplate的值是null的情况;
而当你不去new一个RedisUtil对象,而是去SpringIOC容器中去引入RedisUtil对象的时候,因为redisTemplate对象也在SpringIOC容器中,所以SpringIOC容器里面的RedisUtil工具类里的redisTemplate对象可以从SpringIOC容器中共获取,因此空指针错误也就消失了;
所以,以后在一个程序中,如果你想要new对象,那么所有的地方都用new对象的形式得到对象;如果你想要从SpringIOC容器中获取对象,那么所有地方尽量不要出现new一个对象的形式。
4.在Redis服务器中查看测试结果
如下图: