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空指针异常相关推荐

  1. Java封装OkHttp3工具类

    点击关注公众号,Java干货及时送达  作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...

  2. 基于Java封装Groovy工具类

    1.首先在POM文件引入对应核心groovy jar <dependency><groupId>org.codehaus.groovy</groupId><a ...

  3. redis工具类RedisUtils

    @Component public class RedisUtils {@Autowiredpublic RedisTemplate redisTemplate;/*** 缓存基本的对象,Intege ...

  4. Springboot集成Redis和Redis工具类

    目录 1.导入依赖 2.修改配置文件 3.测试 4.使用redis存入对象 5.redis自定义封装 RedisUtils工具类 1.导入依赖 <dependency><groupI ...

  5. springboot 集成 redis 工具类

    添加依赖 <!-- SpringBoot Boot Redis --><dependency><groupId>org.springframework.boot&l ...

  6. Spring Redis工具类

    /*** spring redis 工具类**/ @Component @SuppressWarnings(value = { "unchecked", "rawtype ...

  7. Redis工具类封装RedisUtils(两种)

    RedisTemplate工具类1 本文参考:https://blog.it-follower.com/posts/2563248908.html SpringBoot项目集成Redis相当简单,只需 ...

  8. Redis工具类封装RedisUtils

    本文参考:https://blog.it-follower.com/posts/2563248908.html SpringBoot项目集成Redis相当简单,只需要pom中加入对应依赖 <de ...

  9. SpringBoot Redis工具类封装

    SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果.因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable).看了很多博客后, ...

最新文章

  1. android开发过程中项目中遇到的坑----布点问题
  2. 14、Docker监控方案(Prometheus+cAdvisor+Grafana)
  3. 8G的U盘轻松帮助你安装win7/win8/win10/xp系统
  4. HDU 5001 概率DP || 记忆化搜索
  5. 教你如果设置自己喜欢的QQ背景音乐
  6. 设计模式:桥接模式(Bridge Pattern)
  7. zoj 3705 Applications
  8. Qt工作笔记-把文件逐行读到ListWidget中
  9. word是不是计算机硬件,word及excel模拟试题1_计算机硬件及应用_IT/计算机_资料
  10. php截取一个中文字符,php中的一个中文字符串截取函数
  11. 机器学习之SVM调参实例
  12. 谈一谈商品编码的问题
  13. 001LeetCode--TwoSum
  14. Flex builder3相关
  15. Java调用soap协议的webservice
  16. maze走迷宫-C++
  17. 苹果手机用android,用习惯了苹果手机还能从苹果换到安卓吗?
  18. ChatGPT接入微信公众号(手把手教学)
  19. oracle常用函数之trim( )、ltrim( )、rtrim( )
  20. 吴忠军 - 素描

热门文章

  1. MATLAB实现FFT及信号的谱分析
  2. jackson多态序列化与反序列化
  3. endnote中CWYW无文件_Endnote软件的使用,有图有干货!
  4. 微星B550M迫击炮WiFi板第二条M2固态(M2_2接口)不识别问题
  5. C#与倍福PLC通讯手册之--TcAdsClient类属性方法探索
  6. 车辆计数系统 python实现
  7. NMT评价指标-BLEU
  8. C++编写程序一定要加using namespace std吗?命名空间你真的清楚吗?
  9. 【毕业课程设计】基于PLC的立体仓库控制系统设计
  10. Dell台式计算机BIOS放电,电脑进入BIOS的两种实用方法-戴尔台式机bios设置