redis工具类封装

Posted cheng2839

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis工具类封装相关的知识,希望对你有一定的参考价值。

各位读者,大家好!

    本次给大家带来redis的封装类,可以很优雅的操作redis,本工具结合了springframework中的部分注解和类,适用于spring框架的项目使用。

 

    首先,创建一个配置类ConstantConfig,可以很方便读取配置文件:

技术图片
 1 package com.cheng2839.config;
 2 
 3 import lombok.Data;
 4 import org.springframework.beans.factory.annotation.Value;
 5 import org.springframework.context.annotation.Configuration;
 6 
 7 /**
 8  * 配置文件包装类
 9  * @author cheng2839
10  * @date 2018年11月16日
11  */
12 @Data
13 @Configuration
14 public class ConstantConfig {
15 
16     /////////////////// redis配置  ///////////////////
17     @Value("${spring.redis.host}")
18     private String redisHost;
19 
20     @Value("${spring.redis.port}")
21     private int redisPort;
22 
23     @Value("${spring.redis.password}")
24     private String redisPassword;
25 
26     @Value("${spring.redis.database}")
27     private int redisDatabase;
28 
29 }
View Code

创建配置文件application.properties如下:

技术图片
 1 # REDIS配置
 2 spring.redis.database=0
 3 spring.redis.host=127.0.0.1
 4 spring.redis.port=6379
 5 spring.redis.password=
 6 spring.redis.pool.max-active=200
 7 spring.redis.pool.max-wait=10000
 8 spring.redis.pool.max-idle=50
 9 spring.redis.pool.min-idle=5
10 spring.redis.timeout=10000
View Code

最后,redis配置类RedisConfig如下:

技术图片
  1 package com.cheng2839.config;
  2 
  3 import com.fasterxml.jackson.annotation.JsonAutoDetect;
  4 import com.fasterxml.jackson.annotation.PropertyAccessor;
  5 import com.fasterxml.jackson.databind.ObjectMapper;
  6 import org.slf4j.Logger;
  7 import org.slf4j.LoggerFactory;
  8 import org.springframework.beans.factory.annotation.Autowired;
  9 import org.springframework.cache.annotation.CachingConfigurerSupport;
 10 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
 11 import org.springframework.data.redis.core.RedisTemplate;
 12 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 13 import org.springframework.data.redis.serializer.StringRedisSerializer;
 14 import org.springframework.stereotype.Component;
 15 
 16 import java.util.concurrent.TimeUnit;
 17 
 18 /**
 19  * Redis配置及基础方法实现封装类
 20  * @author cheng2839
 21  * @date 2018年11月16日
 22  */
 23 @Component
 24 public class RedisConfig extends CachingConfigurerSupport {
 25 
 26     private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
 27 
 28     @Autowired
 29     private ConstantConfig config;
 30 
 31     private RedisTemplate<String, Object> redisTemplate;
 32 
 33 
 34     /**
 35      * 创建构造器, 不使用@Bean是因为禁止在其他地方注入JedisConnectionFactory和RedisTemplate
 36      * @author cheng2839
 37      * @date 2018年11月16日
 38      */
 39     public RedisConfig(){
 40         createRedisTemplate(createFactory());
 41     }
 42 
 43     /**
 44      * 创建JedisConnectionFactory
 45      * @return
 46      * @author cheng2839
 47      * @date 2018年11月16日
 48      */
 49     public JedisConnectionFactory createFactory() {
 50         JedisConnectionFactory factory = new JedisConnectionFactory();
 51         factory.setHostName(config.getRedisHost());
 52         factory.setPort(config.getRedisPort());
 53         factory.setPassword(config.getRedisPassword());
 54         factory.setDatabase(config.getRedisDatabase());
 55         return factory;
 56     }
 57 
 58     /**
 59      * 创建RedisTemplate
 60      * @param factory
 61      * @return
 62      */
 63     public RedisTemplate<String, Object> createRedisTemplate(JedisConnectionFactory factory) {
 64         redisTemplate = new RedisTemplate<>();
 65         redisTemplate.setConnectionFactory(factory);
 66 
 67         //设置序列化/反序列化方式
 68         Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
 69         ObjectMapper mapper = new ObjectMapper();
 70         mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
 71         mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
 72         serializer.setObjectMapper(mapper);
 73 
 74         redisTemplate.setValueSerializer(serializer);
 75         redisTemplate.setKeySerializer(new StringRedisSerializer());
 76         redisTemplate.afterPropertiesSet();
 77         return redisTemplate;
 78     }
 79 
 80 
 81     //////////////////   下面为 Redis基础操作方法 可根据情况扩展  //////////////////
 82 
 83     /**
 84      * 添加一个key,无过期时间
 85      * @param key
 86      * @param value
 87      * @author cheng2839
 88      * @date 2018年11月16日
 89      */
 90     public void set(String key, Object value) {
 91         logger.info("[redis.set:({},{})]", key, value);
 92         redisTemplate.opsForValue().set(key, value);
 93     }
 94 
 95     /**
 96      * 添加一个key,并设置过期时间
 97      * @param key
 98      * @param value
 99      * @param time
100      * @param timeUnit
101      * @author cheng2839
102      * @date 2018年11月16日
103      */
104     public void set(String key, Object value, long time, TimeUnit timeUnit) {
105         logger.info("[redis.set:({},{})-({} {})]", key, value, time, timeUnit);
106         redisTemplate.opsForValue().set(key, value, time, timeUnit);
107     }
108 
109     /**
110      * get redis value
111      * @param key
112      * @return
113      * @author cheng2839
114      * @date 2018年11月16日
115      */
116     public Object get(String key) {
117         logger.info("[redis.get:({})]", key);
118         return redisTemplate.opsForValue().get(key);
119     }
120 
121     /**
122      * 设置key的过期时间
123      * @param key
124      * @param time
125      * @param timeUnit
126      * @author cheng2839
127      * @date 2018年11月16日
128      */
129     public void expire(String key, long time, TimeUnit timeUnit) {
130         logger.info("[redis.expire:({})-({} {})]", key, time, timeUnit);
131         redisTemplate.expire(key, time, timeUnit);
132     }
133 
134     /**
135      * 删除key
136      * @param key
137      * @author cheng2839
138      * @date 2018年11月16日
139      */
140     public void delete(String key){
141         logger.info("[redis.delete:({})]", key);
142         redisTemplate.delete(key);
143     }
144 
145     /**
146      * 判断key是否存在
147      * @param key
148      * @return
149      * @author cheng2839
150      * @date 2018年11月16日
151      */
152     public boolean hasKey(String key) {
153         logger.info("[redis.hasKey:({})]", key);
154         return redisTemplate.hasKey(key);
155     }
156 
157     //////////////////   上面为 Redis基础操作方法 可根据情况扩展  //////////////////
158 
159 }
View Code

 

使用也很方便,我们创建一个RedisTest测试类来测试一下:

技术图片
 1 package com.cheng2839.test;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import com.cheng2839.config.RedisConfig;
 5 
 6 public class RedisTest {
 7 
 8     @Autowired
 9     private RedisConfig redisConfig;
10 
11     public static void main(String[] args) {
12         String key = "cheng2839";
13         redisConfig.set(key, "这是我的博客");
14         Object val = redisConfig.get(key);
15         System.out.println("查询redis中的值:key:" + key + "	value:" + val);
16 
17         boolean hasKey = redisConfig.hasKey(key);
18         System.out.println("查询redis中key:" + key + ":" + hasKey);
19 
20         redisConfig.delete(key);
21         val = redisConfig.get(key);
22         System.out.println("查询redis中的值:key:" + key + "	value:" + val);
23     }
24 
25 }
View Code

测试打印日志如下:

1 查询redis中的值:key:cheng2839    value:这是我的博客
2 查询redis中key:cheng2839:true
3 查询redis中的值:key:cheng2839    value:null

 

      后续给大家带来redis的安装、部署、配置;包括集群的设置等

以上是关于redis工具类封装的主要内容,如果未能解决你的问题,请参考以下文章

Redis缓存穿透,缓存击穿,缓存雪崩解决方案以及封装Redis工具类

Redis缓存穿透,缓存击穿,缓存雪崩解决方案以及封装Redis工具类

Redis缓存穿透,缓存击穿,缓存雪崩解决方案以及封装Redis工具类

Redis实战-工具类封装(全类型操作/分布式锁/消息队列/自增序列)

Redis实战-工具类封装(全类型操作/分布式锁/消息队列/自增序列)

redis工具类封装