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 }
创建配置文件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
最后,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 }
使用也很方便,我们创建一个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 }
测试打印日志如下:
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实战-工具类封装(全类型操作/分布式锁/消息队列/自增序列)