spring boot集成redis缓存
Posted kingly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot集成redis缓存相关的知识,希望对你有一定的参考价值。
上一个文字讲了redis的安装与运行,本次就不再赘述,本文讲解使用spring boot项目集成redis
第一步:先看下项目目录构成,红框的部分是redis的类与配置内容,如下:
1、增加redis依赖项,在pom文件中增加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.0.RELEASE</version> </dependency>
2、创建redis的配置类RedisConfig
1 package com.yl.demo.conf; 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.springframework.cache.annotation.CachingConfigurerSupport; 7 import org.springframework.cache.annotation.EnableCaching; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 import org.springframework.data.redis.connection.RedisConnectionFactory; 11 import org.springframework.data.redis.core.*; 12 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; 13 import org.springframework.data.redis.serializer.StringRedisSerializer; 14 15 /** 16 * redis配置类 17 * @program: springbootdemo 18 * @Date: 2020/7/11 19 * @Author: yangl 20 * @Description: 21 */ 22 @Configuration 23 @EnableCaching //开启注解 24 public class RedisConfig extends CachingConfigurerSupport { 25 26 /** 27 * retemplate相关配置 28 * @param factory 29 * @return 30 */ 31 @Bean 32 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { 33 34 RedisTemplate<String, Object> template = new RedisTemplate<>(); 35 // 配置连接工厂 36 template.setConnectionFactory(factory); 37 38 //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) 39 Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); 40 41 ObjectMapper om = new ObjectMapper(); 42 // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public 43 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 44 // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 45 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 46 jacksonSeial.setObjectMapper(om); 47 48 // 值采用json序列化 49 template.setValueSerializer(jacksonSeial); 50 //使用StringRedisSerializer来序列化和反序列化redis的key值 51 template.setKeySerializer(new StringRedisSerializer()); 52 53 // 设置hash key 和value序列化模式 54 template.setHashKeySerializer(new StringRedisSerializer()); 55 template.setHashValueSerializer(jacksonSeial); 56 template.afterPropertiesSet(); 57 58 return template; 59 } 60 61 /** 62 * 对hash类型的数据操作 63 * 64 * @param redisTemplate 65 * @return 66 */ 67 @Bean 68 public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { 69 return redisTemplate.opsForHash(); 70 } 71 72 /** 73 * 对redis字符串类型数据操作 74 * 75 * @param redisTemplate 76 * @return 77 */ 78 @Bean 79 public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) { 80 return redisTemplate.opsForValue(); 81 } 82 83 /** 84 * 对链表类型的数据操作 85 * 86 * @param redisTemplate 87 * @return 88 */ 89 @Bean 90 public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { 91 return redisTemplate.opsForList(); 92 } 93 94 /** 95 * 对无序集合类型的数据操作 96 * 97 * @param redisTemplate 98 * @return 99 */ 100 @Bean 101 public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { 102 return redisTemplate.opsForSet(); 103 } 104 105 /** 106 * 对有序集合类型的数据操作 107 * 108 * @param redisTemplate 109 * @return 110 */ 111 @Bean 112 public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { 113 return redisTemplate.opsForZSet(); 114 } 115 116 }
3、创建redis工具类RedisUtil
1 package com.yl.demo.utils; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.data.redis.core.RedisTemplate; 5 import org.springframework.stereotype.Component; 6 import org.springframework.util.CollectionUtils; 7 8 import java.util.List; 9 import java.util.Map; 10 import java.util.Set; 11 import java.util.concurrent.TimeUnit; 12 13 /** 14 * redisTemplate封装 15 * @Date 2020-07-11 16 * @author yanglei 17 */ 18 @Component 19 public class RedisUtil { 20 21 @Autowired 22 private RedisTemplate<String, Object> redisTemplate; 23 24 public RedisUtil(RedisTemplate<String, Object> redisTemplate) { 25 this.redisTemplate = redisTemplate; 26 } 27 28 /** 29 * 指定缓存失效时间 30 * @param key 键 31 * @param time 时间(秒) 32 * @return 33 */ 34 public boolean expire(String key,long time){ 35 try { 36 if(time>0){ 37 redisTemplate.expire(key, time, TimeUnit.SECONDS); 38 } 39 return true; 40 } catch (Exception e) { 41 e.printStackTrace(); 42 return false; 43 } 44 } 45 46 /** 47 * 根据key 获取过期时间 48 * @param key 键 不能为null 49 * @return 时间(秒) 返回0代表为永久有效 50 */ 51 public long getExpire(String key){ 52 return redisTemplate.getExpire(key,TimeUnit.SECONDS); 53 } 54 55 /** 56 * 判断key是否存在 57 * @param key 键 58 * @return true 存在 false不存在 59 */ 60 public boolean hasKey(String key){ 61 try { 62 return redisTemplate.hasKey(key); 63 } catch (Exception e) { 64 e.printStackTrace(); 65 return false; 66 } 67 } 68 69 /** 70 * 删除缓存 71 * @param key 可以传一个值 或多个 72 */ 73 @SuppressWarnings("unchecked") 74 public void del(String ... key){ 75 if(key!=null&&key.length>0){ 76 if(key.length==1){ 77 redisTemplate.delete(key[0]); 78 }else{ 79 redisTemplate.delete(CollectionUtils.arrayToList(key)); 80 } 81 } 82 } 83 84 //============================String============================= 85 /** 86 * 普通缓存获取 87 * @param key 键 88 * @return 值 89 */ 90 public Object get(String key){ 91 return key==null?null:redisTemplate.opsForValue().get(key); 92 } 93 94 /** 95 * 普通缓存放入 96 * @param key 键 97 * @param value 值 98 * @return true成功 false失败 99 */ 100 public boolean set(String key,Object value) { 101 try { 102 redisTemplate.opsForValue().set(key, value); 103 return true; 104 } catch (Exception e) { 105 e.printStackTrace(); 106 return false; 107 } 108 } 109 110 /** 111 * 普通缓存放入并设置时间 112 * @param key 键 113 * @param value 值 114 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 115 * @return true成功 false 失败 116 */ 117 public boolean set(String key,Object value,long time){ 118 try { 119 if(time>0){ 120 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); 121 }else{ 122 set(key, value); 123 } 124 return true; 125 } catch (Exception e) { 126 e.printStackTrace(); 127 return false; 128 } 129 } 130 131 /** 132 * 递增 133 * @param key 键 134 * @param delta 要增加几(大于0) 135 * @return 136 */ 137 public long incr(String key, long delta){ 138 if(delta<0){ 139 throw new RuntimeException("递增因子必须大于0"); 140 } 141 return redisTemplate.opsForValue().increment(key, delta); 142 } 143 144 /** 145 * 递减 146 * @param key 键 147 * @param delta 要减少几(小于0) 148 * @return 149 */ 150 public long decr(String key, long delta){ 151 if(delta<0){ 152 throw new RuntimeException("递减因子必须大于0"); 153 } 154 return redisTemplate.opsForValue().increment(key, -delta); 155 } 156 157 //================================Map================================= 158 /** 159 * HashGet 160 * @param key 键 不能为null 161 * @param item 项 不能为null 162 * @return 值 163 */ 164 public Object hget(String key,String item){ 165 return redisTemplate.opsForHash().get(key, item); 166 } 167 168 /** 169 * 获取hashKey对应的所有键值 170 * @param key 键 171 * @return 对应的多个键值 172 */ 173 public Map<Object,Object> hmget(String key){ 174 return redisTemplate.opsForHash().entries(key); 175 } 176 177 /** 178 * HashSet 179 * @param key 键 180 * @param map 对应多个键值 181 * @return true 成功 false 失败 182 */ 183 public boolean hmset(String key, Map<String,Object> map){ 184 try { 185 redisTemplate.opsForHash().putAll(key, map); 186 return true; 187 } catch (Exception e) { 188 e.printStackTrace(); 189 return false; 190 } 191 } 192 193 /** 194 * HashSet 并设置时间 195 * @param key 键 196 * @param map 对应多个键值 197 * @param time 时间(秒) 198 * @return true成功 false失败 199 */ 200 public boolean hmset(String key, Map<String,Object> map, long time){ 201 try { 202 redisTemplate.opsForHash().putAll(key, map); 203 if(time>0){ 204 expire(key, time); 205 } 206 return true; 207 } catch (Exception e) { 208 e.printStackTrace(); 209 return false; 210 } 211 } 212 213 /** 214 * 向一张hash表中放入数据,如果不存在将创建 215 * @param key 键 216 * @param item 项 217 * @param value 值 218 * @return true 成功 false失败 219 */ 220 public boolean hset(String key,String item,Object value) { 221 try { 222 redisTemplate.opsForHash().put(key, item, value); 223 return true; 224 } catch (Exception e) { 225 e.printStackTrace(); 226 return false; 227 } 228 } 229 230 /** 231 * 向一张hash表中放入数据,如果不存在将创建 232 * @param key 键 233 * @param item 项 234 * @param value 值 235 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 236 * @return true 成功 false失败 237 */ 238 public boolean hset(String key,String item,Object value,long time) { 239 try { 240 redisTemplate.opsForHash().put(key, item, value); 241 if(time>0){ 242 expire(key, time); 243 } 244 return true; 245 } catch (Exception e) { 246 e.printStackTrace(); 247 return false; 248 } 249 } 250 251 /** 252 * 删除hash表中的值 253 * @param key 键 不能为null 254 * @param item 项 可以使多个 不能为null 255 */ 256 public void hdel(String key, Object... item){ 257 redisTemplate.opsForHash().delete(key,item); 258 } 259 260 /** 261 * 判断hash表中是否有该项的值 262 * @param key 键 不能为null 263 * @param item 项 不能为null 264 * @return true 存在 false不存在 265 */ 266 public boolean hHasKey(String key, String item){ 267 return redisTemplate.opsForHash().hasKey(key, item); 268 } 269 270 /** 271 * hash递增 如果不存在,就会创建一个 并把新增后的值返回 272 * @param key 键 273 * @param item 项 274 * @param by 要增加几(大于0) 275 * @return 276 */ 277 public double hincr(String key, String item,double by){ 278 return redisTemplate.opsForHash().increment(key, item, by); 279 } 280 281 /** 282 * hash递减 283 * @param key 键 284 * @param item 项 285 * @param by 要减少记(小于0) 286 * @return 287 */ 288 public double hdecr(String key, String item,double by){ 289 return redisTemplate.opsForHash().increment(key, item,-by); 290 } 291 292 //spring boot集成redis缓存