Java封装redis工具类RedisUtils,以及在@Postconstruct注解中调用redis可能出现redisTemplate空指针异常
1、封装redis工具类RedisUtils
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** @author xuxilan*/
@Component
public class RedisUtils {private static RedisTemplate<String, Object> redisTemplate;@Resourcepublic void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {RedisUtils.redisTemplate = redisTemplate;}/*** 根据正则表达式,获取所有key值* @param patten* @return*/public static Set<String> getAllKeys(String patten){return redisTemplate.keys(patten);}/*** 设置单个缓存* @param key* @param value* @param expire* @param timeUnit*/public static void set(String key, Object value, long expire, TimeUnit timeUnit){redisTemplate.opsForValue().set(key, value, expire, timeUnit);}/*** 普通缓存* @param key* @param value*/public static void set(String key, Object value) {redisTemplate.opsForValue().set(key,value);}/*** 按秒缓存* @param key* @param value* @param expire*/public static void setSeconds(String key, Object value, long expire) {set(key,value,expire, TimeUnit.SECONDS);}/*** 按分钟缓存* @param key* @param value* @param expire*/public static void setMinutes(String key, Object value, long expire) {set(key,value,expire, TimeUnit.MINUTES);}/*** 按小时缓存* @param key* @param value* @param expire*/public static void setHours(String key, Object value, long expire) {set(key,value,expire, TimeUnit.HOURS);}/*** 通过key 获取value*/public static Object get(String key){return redisTemplate.opsForValue().get(key);}/*** 设置过期时间* @param key* @param timeout* @param timeUnit*/public static void expire(String key, long timeout, TimeUnit timeUnit){redisTemplate.expire(key,timeout,timeUnit);}/*** 获取过期时间* @param key* @return*/public static Long getExpire(String key){return redisTemplate.getExpire(key);}/*** 判断是否存在某个 key* @param key* @return*/public static boolean hasKey(String key) {Boolean hasKey = redisTemplate.hasKey(key);return hasKey != null && hasKey;}/*** 删除某个 key* @param key*/public static void delete(String key) {redisTemplate.delete(key);}/*** 给 value 自增1* @param key*/public void increment(String key){redisTemplate.boundValueOps(key).increment(1);}/*** 给 value 减少1* @param key*/public void decrement(String key){redisTemplate.boundValueOps(key).increment(-1);}public static boolean nSet(String key, Object value,long timeout,TimeUnit timeUnit){return redisTemplate.opsForValue().setIfAbsent(key,value,timeout,timeUnit);}/*************************** opsForZSet ************************************//*** 添加* @param key* @param member* @param score*/public static void zAdd(String key, Object member, double score) {redisTemplate.opsForZSet().add(key,member,score);}/*** 批量添加* @param key* @param typedTuples*/public static void zmAdd(String key, Set<ZSetOperations.TypedTuple<Object>> typedTuples){if (typedTuples == null || typedTuples.size() == 0) {return;}redisTemplate.opsForZSet().add(key,typedTuples);}/*** 根据分数范围获取成员及分数* @param key* @param min* @param max* @return*/public static Set<ZSetOperations.TypedTuple<Object>> zRangeByScoreWithScores(String key, double min, double max){return redisTemplate.opsForZSet().rangeByScoreWithScores(key,min,max);}/*** 根据分数范围获取成员* @param key* @param min* @param max* @return*/public static Set<Object> zRangeByScore(String key, double min, double max){return redisTemplate.opsForZSet().rangeByScore(key,min,max);}public static Set<Object> zReverseRangeByScore(String key, double min, double max){return redisTemplate.opsForZSet().reverseRangeByScore(key,min,max);}/*** 删除所有* @param key*/public static void zRemoveAllByScore(String key){redisTemplate.opsForZSet().removeRangeByScore(key,0,-1);}public static Set<Object> zGetReverseRange(String key,int start,int end){return redisTemplate.opsForZSet().reverseRange(key, start, end);}public static Set<Object> zGetRange(String key,int start,int end){return redisTemplate.opsForZSet().range(key, start, end);}public static Set<Object> zGetAllRange(String key){return redisTemplate.opsForZSet().range(key, 0,-1);}public static Double zGetScore(String key,Object member){return redisTemplate.opsForZSet().score(key,member);}/*** 判断zset中是否存在某个值* @param key* @param member* @return*/public static boolean zExist(String key, Object member) {Long rank = redisTemplate.opsForZSet().rank(key, member);return rank != null;}/*** 删除某个成员* @param key* @param member*/public static void zRem(String key, Object member) {redisTemplate.opsForZSet().remove(key,member);}public static Double zincrby(String key,Object member,double delta){return redisTemplate.opsForZSet().incrementScore(key,member,delta);}/*************************** opsForHash ************************************/public static void hSet(String hashKey, Object key, Object value) {redisTemplate.opsForHash().put(hashKey,key,value);}public static Object hGet(String hashKey, Object key) {return redisTemplate.opsForHash().get(hashKey,key);}public static List<Object> hGetAll(String key) {return redisTemplate.opsForHash().values(key);}/*************************** opsForList ************************************/public static void leftPush(String key,Object value){redisTemplate.opsForList().leftPush(key, value);}public static void rightPush(String key,Object value){redisTemplate.opsForList().rightPush(key, value);}public static Object rightPop(String key){return redisTemplate.opsForList().rightPop(key);}}
用不到的可自行删除
2、注意事项
在使用
@Postconstruct
注解时,如果调用redis工具类,redisTemplate
有可能会出现空指针导致异常错误,大概是上面的RedisUtils
的@Resource
注解还未注入的原因导致空指针异常,如果需要在项目启动时执行某段代码中有调用redis,请不要用@Postconstruct
,可以实现接口InitializingBean
、或是CommandLineRunner
、或是ApplicationRunner
。
当然也可以使用@Bean
注入使用,如下:
// 三种方法最好都在类上加一个 @Component
@Component
public class Auto() {@BeanInitializingBean initializingBean() {return () -> {// 要执行的代码};}@BeanCommandLineRunner commandLineRunner() {return args -> {// 要执行的代码};}@BeanApplicationRunner applicationRunner() {return args -> {// 要执行的代码};}
}
当然,如果非要用
@Postconstruct
注解也可以,需要将上述的
private static RedisTemplate<String, Object> redisTemplate;@Resourcepublic void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {RedisUtils.redisTemplate = redisTemplate;}
替换成
private static final RedisTemplate<String, Object> redisTemplate;static {redisTemplate = SpringUtils.getBean("redisTemplate");}
即使用
SpringUtils
工具类获取bean即可,同时要去掉类上的@Component
注解。
不过,这也和redis
的版本有很大的关系。低版本的redis
并不会有这种问题,比如3.x
版本,所以如果遇到此类问题,也可以将redis
版本往下调即可。
SpringUtils
工具类如下。
3、SpringUtils工具类
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringUtils.applicationContext = applicationContext;}/*** 获取applicationContext对象* @return*/public static ApplicationContext getApplicationContext() {return applicationContext;}public static <T> T getBean(String id, Class<T> clazz) {return (T) getBeanById(id);}public static <T> T getBean(String id) {return (T) getBeanById(id);}/*** 根据bean的id来查找对象* @param id* @return*/public static Object getBeanById(String id) {return applicationContext.getBean(id);}/*** 根据bean的class来查找对象* @param c* @return*/public static <T> T getBeanByClass(Class<T> c) {return applicationContext.getBean(c);}/*** 根据bean的class来查找所有的对象(包括子类)* @param c* @return*/public static <T> Map<String, T> getBeansByClass(Class<T> c) {return applicationContext.getBeansOfType(c);}
}
Java封装redis工具类RedisUtils,以及在@Postconstruct注解中调用redis可能出现redisTemplate空指针异常相关推荐
- Java封装OkHttp3工具类
点击关注公众号,Java干货及时送达 作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...
- 基于Java封装Groovy工具类
1.首先在POM文件引入对应核心groovy jar <dependency><groupId>org.codehaus.groovy</groupId><a ...
- redis工具类RedisUtils
@Component public class RedisUtils {@Autowiredpublic RedisTemplate redisTemplate;/*** 缓存基本的对象,Intege ...
- Springboot集成Redis和Redis工具类
目录 1.导入依赖 2.修改配置文件 3.测试 4.使用redis存入对象 5.redis自定义封装 RedisUtils工具类 1.导入依赖 <dependency><groupI ...
- springboot 集成 redis 工具类
添加依赖 <!-- SpringBoot Boot Redis --><dependency><groupId>org.springframework.boot&l ...
- Spring Redis工具类
/*** spring redis 工具类**/ @Component @SuppressWarnings(value = { "unchecked", "rawtype ...
- Redis工具类封装RedisUtils(两种)
RedisTemplate工具类1 本文参考:https://blog.it-follower.com/posts/2563248908.html SpringBoot项目集成Redis相当简单,只需 ...
- Redis工具类封装RedisUtils
本文参考:https://blog.it-follower.com/posts/2563248908.html SpringBoot项目集成Redis相当简单,只需要pom中加入对应依赖 <de ...
- SpringBoot Redis工具类封装
SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果.因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable).看了很多博客后, ...
最新文章
- android开发过程中项目中遇到的坑----布点问题
- 14、Docker监控方案(Prometheus+cAdvisor+Grafana)
- 8G的U盘轻松帮助你安装win7/win8/win10/xp系统
- HDU 5001 概率DP || 记忆化搜索
- 教你如果设置自己喜欢的QQ背景音乐
- 设计模式:桥接模式(Bridge Pattern)
- zoj 3705 Applications
- Qt工作笔记-把文件逐行读到ListWidget中
- word是不是计算机硬件,word及excel模拟试题1_计算机硬件及应用_IT/计算机_资料
- php截取一个中文字符,php中的一个中文字符串截取函数
- 机器学习之SVM调参实例
- 谈一谈商品编码的问题
- 001LeetCode--TwoSum
- Flex builder3相关
- Java调用soap协议的webservice
- maze走迷宫-C++
- 苹果手机用android,用习惯了苹果手机还能从苹果换到安卓吗?
- ChatGPT接入微信公众号(手把手教学)
- oracle常用函数之trim( )、ltrim( )、rtrim( )
- 吴忠军 - 素描
热门文章
- MATLAB实现FFT及信号的谱分析
- jackson多态序列化与反序列化
- endnote中CWYW无文件_Endnote软件的使用,有图有干货!
- 微星B550M迫击炮WiFi板第二条M2固态(M2_2接口)不识别问题
- C#与倍福PLC通讯手册之--TcAdsClient类属性方法探索
- 车辆计数系统 python实现
- NMT评价指标-BLEU
- C++编写程序一定要加using namespace std吗?命名空间你真的清楚吗?
- 【毕业课程设计】基于PLC的立体仓库控制系统设计
- Dell台式计算机BIOS放电,电脑进入BIOS的两种实用方法-戴尔台式机bios设置