SpringBoot整合Redis并完成工具类
Posted johanchan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合Redis并完成工具类相关的知识,希望对你有一定的参考价值。
SpringBoot整合Redis的资料很多,但是我只需要整合完成后,可以操作Redis就可以了,所以不需要配合缓存相关的注解使用(如@Cacheable),而且我的系统框架用的日志是log4j,不是SpringBoot默认的Logback。通过查询资料我完成了Redis整合,并写了Redis操作工具类。特意在此记录一下,分享给大家,也方便以后查阅。
1.SpringBoot版本如下
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
2.添加Redis依赖
2.1如果没有特殊要求,直接添加依赖即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2.2如开篇所说,我不想要SpringBoot默认的日志,spring-boot-starter-data-redis包里自带了Logback的jar包,所以2.1的依赖不是我想要的,我的依赖如下
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>2.0.11.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
这两个依赖只是spring-boot-starter-data-redis依赖里关于Redis的依赖包,其实只需要这两个就OK了
3.application.properties中加入redis相关配置
#Redis spring.redis.host=192.168.0.202 #redis.host=192.168.0.202 ## Redis服务器连接端口 spring.redis.port=6379 ## 连接超时时间(毫秒) redis.timeout=3 ## Redis服务器连接密码(默认为空) redis.password=123456 ## 连接池中的最大连接数 redis.poolMaxTotal=10 ## 连接池中的最大空闲连接 redis.poolMaxIdle=10 ## 连接池最大阻塞等待时间(使用负值表示没有限制) redis.poolMaxWait=3
4.Redis模板及基本操作方法
查过资料的小伙伴们应该知道,SpringBoot的Redis模板配置类有一定的局限性,这里不再赘述,我自己写了一个RedisTemplate,直接贴代码
package com.gemdale.redis;
import com.alibaba.fastjson.JSON;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisTemplateService
private static StringRedisTemplate stringRedisTemplate;
public <T> boolean set(String key ,T value)
try
//任意类型转换成String
String val = beanToString(value);
if(val==null||val.length()<=0)
return false;
getStringRedisTemplate().opsForValue().set(key,val);
return true;
catch (Exception e)
return false;
public <T> T get(String key,Class<T> clazz)
try
String value = getStringRedisTemplate().opsForValue().get(key);
return stringToBean(value,clazz);
catch (Exception e)
return null ;
@SuppressWarnings("unchecked")
private <T> T stringToBean(String value, Class<T> clazz)
if(value==null||value.length()<=0||clazz==null)
return null;
if(clazz ==int.class ||clazz==Integer.class)
return (T)Integer.valueOf(value);
else if(clazz==long.class||clazz==Long.class)
return (T)Long.valueOf(value);
else if(clazz==String.class)
return (T)value;
else
return JSON.toJavaObject(JSON.parseObject(value),clazz);
/**
*
* @param value T任意类型
* @return String
*/
private <T> String beanToString(T value)
if(value==null)
return null;
Class <?> clazz = value.getClass();
if(clazz==int.class||clazz==Integer.class)
return ""+value;
else if(clazz==long.class||clazz==Long.class)
return ""+value;
else if(clazz==String.class)
return (String)value;
else
return JSON.toJSONString(value);
//获取RedisTemplate
public static RedisTemplate<String, String> getStringRedisTemplate()
if (stringRedisTemplate == null)
synchronized (RedisTemplateService.class)
if (stringRedisTemplate == null)
stringRedisTemplate = new StringRedisTemplate(redisConnectionFactory());
return stringRedisTemplate;
public static RedisConnectionFactory redisConnectionFactory()
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName("192.168.0.202");
jedisConnectionFactory.setPort(6379);
jedisConnectionFactory.setPassword("123456");
return jedisConnectionFactory;
5.Redis工具类
我另外写了一个专门的工具类,没有聚验证,有需要的小伙伴可以参考指正,放在这里只为备忘
1 package com.winmine.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 @Component 14 public class RedisUtils 15 @Autowired 16 private RedisTemplate<String, Object> redisTemplate; 17 18 // =============================common============================ 19 /** 20 * 指定缓存失效时间 21 * @param key 键 22 * @param time 时间(秒) 23 * @return 24 */ 25 public boolean expire(String key, long time) 26 try 27 if (time > 0) 28 redisTemplate.expire(key, time, TimeUnit.SECONDS); 29 30 return true; 31 catch (Exception e) 32 e.printStackTrace(); 33 return false; 34 35 36 /** 37 * 根据key 获取过期时间 38 * @param key 键 不能为null 39 * @return 时间(秒) 返回0代表为永久有效 40 */ 41 public long getExpire(String key) 42 return redisTemplate.getExpire(key, TimeUnit.SECONDS); 43 44 /** 45 * 判断key是否存在 46 * @param key 键 47 * @return true 存在 false不存在 48 */ 49 public boolean hasKey(String key) 50 try 51 return redisTemplate.hasKey(key); 52 catch (Exception e) 53 e.printStackTrace(); 54 return false; 55 56 57 58 /** 59 * 删除缓存 60 * @param key 可以传一个值 或多个 61 */ 62 @SuppressWarnings("unchecked") 63 public void del(String... key) 64 if (key != null && key.length > 0) 65 if (key.length == 1) 66 redisTemplate.delete(key[0]); 67 else 68 redisTemplate.delete(CollectionUtils.arrayToList(key)); 69 70 71 72 73 // ============================String============================= 74 /** 75 * 普通缓存获取 76 * @param key 键 77 * @return 值 78 */ 79 public Object get(String key) 80 return key == null ? null : redisTemplate.opsForValue().get(key); 81 82 /** 83 * 普通缓存放入 84 * @param key 键 85 * @param value 值 86 * @return true成功 false失败 87 */ 88 public boolean set(String key, Object value) 89 try 90 redisTemplate.opsForValue().set(key, value); 91 return true; 92 catch (Exception e) 93 e.printStackTrace(); 94 return false; 95 96 97 /** 98 * 普通缓存放入并设置时间 99 * @param key 键 100 * @param value 值 101 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 102 * @return true成功 false 失败 103 */ 104 public boolean set(String key, Object value, long time) 105 try 106 if (time > 0) 107 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); 108 else 109 set(key, value); 110 111 return true; 112 catch (Exception e) 113 e.printStackTrace(); 114 return false; 115 116 117 /** 118 * 递增 119 * @param key 键 120 * @param delta 要增加几(大于0) 121 * @return 122 */ 123 public long incr(String key, long delta) 124 if (delta < 0) 125 throw new RuntimeException("递增因子必须大于0"); 126 127 return redisTemplate.opsForValue().increment(key, delta); 128 129 /** 130 * 递减 131 * @param key 键 132 * @param delta 要减少几(小于0) 133 * @return 134 */ 135 public long decr(String key, long delta) 136 if (delta < 0) 137 throw new RuntimeException("递减因子必须大于0"); 138 139 return redisTemplate.opsForValue().increment(key, -delta); 140 141 142 // ================================Map================================= 143 /** 144 * HashGet 145 * @param key 键 不能为null 146 * @param item 项 不能为null 147 * @return 值 148 */ 149 public Object hget(String key, String item) 150 return redisTemplate.opsForHash().get(key, item); 151 152 /** 153 * 获取hashKey对应的所有键值 154 * @param key 键 155 * @return 对应的多个键值 156 */ 157 public Map<Object, Object> hmget(String key) 158 return redisTemplate.opsForHash().entries(key); 159 160 /** 161 * HashSet 162 * @param key 键 163 * @param map 对应多个键值 164 * @return true 成功 false 失败 165 */ 166 public boolean hmset(String key, Map<String, Object> map) 167 try 168 redisTemplate.opsForHash().putAll(key, map); 169 return true; 170 catch (Exception e) 171 e.printStackTrace(); 172 return false; 173 174 175 /** 176 * HashSet 并设置时间 177 * @param key 键 178 * @param map 对应多个键值 179 * @param time 时间(秒) 180 * @return true成功 false失败 181 */ 182 public boolean hmset(String key, Map<String, Object> map, long time) 183 try 184 redisTemplate.opsForHash().putAll(key, map); 185 if (time > 0) 186 expire(key, time); 187 188 return true; 189 catch (Exception e) 190 e.printStackTrace(); 191 return false; 192 193 194 /** 195 * 向一张hash表中放入数据,如果不存在将创建 196 * @param key 键 197 * @param item 项 198 * @param value 值 199 * @return true 成功 false失败 200 */ 201 public boolean hset(String key, String item, Object value) 202 try 203 redisTemplate.opsForHash().put(key, item, value); 204 return true; 205 catch (Exception e) 206 e.printStackTrace(); 207 return false; 208 209 210 /** 211 * 向一张hash表中放入数据,如果不存在将创建 212 * @param key 键 213 * @param item 项 214 * @param value 值 215 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 216 * @return true 成功 false失败 217 */ 218 public boolean hset(String key, String item, Object value, long time) 219 try 220 redisTemplate.opsForHash().put(key, item, value); 221 if (time > 0) 222 expire(key, time); 223 224 return true; 225 catch (Exception e) 226 e.printStackTrace(); 227 return false; 228 229 230 /** 231 * 删除hash表中的值 232 * @param key 键 不能为null 233 * @param item 项 可以使多个 不能为null 234 */ 235 public void hdel(String key, Object... item) 236 redisTemplate.opsForHash().delete(key, item); 237 238 /** 239 * 判断hash表中是否有该项的值 240 * @param key 键 不能为null 241 * @param item 项 不能为null 242 * @return true 存在 false不存在 243 */ 244 public boolean hHasKey(String key, String item) 245 return redisTemplate.opsForHash().hasKey(key, item); 246 247 /** 248 * hash递增 如果不存在,就会创建一个 并把新增后的值返回 249 * @param key 键 250 * @param item 项 251 * @param by 要增加几(大于0) 252 * @return 253 */ 254 public double hincr(String key, String item, double by) 255 return redisTemplate.opsForHash().increment(key, item, by); 256 257 /** 258 * hash递减 259 * @param key 键 260 * @param item 项 261 * @param by 要减少记(小于0) 262 * @return 263 */ 264 public double hdecr(String key, String item, double by) 265 return redisTemplate.opsForHash().increment(key, item, -by); 266 267 268 // ============================set============================= 269 /** 270 * 根据key获取Set中的所有值 271 * @param key 键 272 * @return 273 */ 274 public Set<Object> sGet(String key) 275 try 276 return redisTemplate.opsForSet().members(key); 277 catch (Exception e) 278 e.printStackTrace(); 279 return null; 280 281 282 283 284 /** 285 * 根据value从一个set中查询,是否存在 286 * @param key 键 287 * @param value 值 288 * @return true 存在 false不存在 289 */ 290 public boolean sHasKey(String key, Object value) 291 try 292 return redisTemplate.opsForSet().isMember(key, value); 293 catch (Exception e) 294 e.printStackTrace(); 295 return false; 296 297 298 299 /** 300 * 将数据放入set缓存 301 * @param key 键 302 * @param values 值 可以是多个 303 * @return 成功个数 304 */ 305 public long sSet(String key, Object... values) 306 try 307 return redisTemplate.opsForSet().add(key, values); 308 catch (Exception e) 309 e.printStackTrace(); 310 return 0; 311 312 313 314 /** 315 * 将set数据放入缓存 316 * @param key 键 317 * @param time 时间(秒) 318 * @param values 值 可以是多个 319 * @return 成功个数 320 */ 321 public long sSetAndTime(String key, long time, Object... values) 322 Long count = 0L; 323 try 324 count = redisTemplate.opsForSet().add(key, values); 325 if (time > 0) 326 expire(key, time); 327 catch (Exception e) 328 e.printStackTrace(); 329 330 return count; 331 332 333 /** 334 * 获取set缓存的长度 335 * @param key 键 336 * @return 337 */ 338 public long sGetSetSize(String key) 339 try 340 return redisTemplate.opsForSet().size(key); 341 catch (Exception e) 342 e.printStackTrace(); 343 return 0; 344 345 346 347 /** 348 * 移除值为value的 349 * @param key 键 350 * @param values 值 可以是多个 351 * @return 移除的个数 352 */ 353 public long setRemove(String key, Object... values) 354 try 355 Long count = redisTemplate.opsForSet().remove(key, values); 356 return count; 357 catch (Exception e) 358 e.printStackTrace(); 359 return 0; 360 361 362 363 // ===============================list================================= 364 365 /** 366 * 获取list缓存的内容 367 * @param key 键 368 * @param start 开始 369 * @param end 结束 0 到 -1代表所有值 370 * @return 371 */ 372 public List<Object> lGet(String key, long start, long end) 373 try 374 return redisTemplate.opsForList().range(key, start, end); 375 catch (Exception e) 376 e.printStackTrace(); 377 return null; 378 379 380 381 /** 382 * 获取list缓存的长度 383 * @param key 键 384 * @return 385 */ 386 public long lGetListSize(String key) 387 try 388 return redisTemplate.opsForList().size(key); 389 catch (Exception e) 390 e.printStackTrace(); 391 return 0; 392 393 394 395 /** 396 * 通过索引 获取list中的值 397 * @param key 键 398 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 399 * @return 400 */ 401 public Object lGetIndex(String key, long index) 402 try 403 return redisTemplate.opsForList().index(key, index); 404 catch (Exception e) 405 e.printStackTrace(); 406 return null; 407 408 409 410 /** 411 * 将list放入缓存 412 * @param key 键 413 * @param value 值 414 * @return 415 */ 416 public boolean lSet(String key, Object value) 417 try 418 redisTemplate.opsForList().rightPush(key, value); 419 return true; 420 catch (Exception e) 421 e.printStackTrace(); 422 return false; 423 424 425 426 /** 427 * 将list放入缓存 428 * @param key 键 429 * @param value 值 430 * @param time 时间(秒) 431 * @return 432 */ 433 public boolean lSet(String key, Object value, long time) 434 try 435 redisTemplate.opsForList().rightPush(key, value); 436 if (time > 0) 437 expire(key, time); 438 return true; 439 catch (Exception e) 440 e.printStackTrace(); 441 return false; 442 443 444 445 /** 446 * 将list放入缓存 447 * @param key 键 448 * @param value 值 449 * @return 450 */ 451 public boolean lSet(String key, List<Object> value) 452 try 453 redisTemplate.opsForList().rightPushAll(key, value); 454 return true; 455 catch (Exception e) 456 e.printStackTrace(); 457 return false; 458 459 460 461 /** 462 * 将list放入缓存 463 * @param key 键 464 * @param value 值 465 * @param time 时间(秒) 466 * @return 467 */ 468 public boolean lSet(String key, List<Object> value, long time) 469 try 470 redisTemplate.opsForList().rightPushAll(key, value); 471 if (time > 0) 472 expire(key, time); 473 474 return true; 475 catch (Exception e) 476 e.printStackTrace(); 477 return false; 478 479 480 481 /** 482 * 根据索引修改list中的某条数据 483 * @param key 键 484 * @param index 索引 485 * @param value 值 486 * @return 487 */ 488 public boolean lUpdateIndex(String key, long index, Object value) 489 try 490 redisTemplate.opsForList().set(key, index, value); 491 return true; 492 catch (Exception e) 493 e.printStackTrace(); 494 return false; 495 496 497 498 /** 499 * 移除N个值为value 500 * @param key 键 501 * @param count 移除多少个 502 * @param value 值 503 * @return 移除的个数 504 */ 505 public long lRemove(String key, long count, Object value) 506 try 507 Long remove = redisTemplate.opsForList().remove(key, count, value); 508 return remove; 509 catch (Exception e) 510 e.printStackTrace(); 511 return 0; 512 513 514 515 516
6.测试
简单测试如下
1 package com.gemdale.redis; 2 3 import com.databus.Log; 4 import com.winmine.utils.MailUtils; 5 import hibernate.Acount; 6 import hibernate.VehicleDevice; 7 import org.hibernate.Session; 8 9 import java.util.*; 10 import java.util.concurrent.ConcurrentSkipListMap; 11 12 public class RedisTest 13 RedisTemplateService redisTemplateService = new RedisTemplateService(); 14 15 16 public void test() 17 Integer count = 1; 18 Set<String> keySet = new LinkedHashSet<>(); 19 Set<Acount> acountSet = new LinkedHashSet<>(); 20 ConcurrentSkipListMap keyMap = new ConcurrentSkipListMap(); 21 ConcurrentSkipListMap acountMap = new ConcurrentSkipListMap(); 22 Calendar calendar = null; 23 LinkedList<Long> list = new LinkedList<>(); 24 25 while (count < 15) 26 calendar = Calendar.getInstance(); 27 // String key = "key"+count; 28 Integer key = count; 29 String testKey = RedisTemplateService.getStringRedisTemplate().opsForValue().get("testkey"); 30 Log.info("键testkey:" + testKey); 31 redisTemplateService.set(key.toString(),calendar.getTimeInMillis()); 32 String value = RedisTemplateService.getStringRedisTemplate().opsForValue().get(key.toString()); 33 Log.info(key + ":" + value); 34 if (keyMap.size() >= 10) 35 keyMap.remove(keyMap.lastKey()); 36 keyMap.put(key,value); 37 38 list.removeFirst(); 39 list.add(calendar.getTimeInMillis()); 40 41 42 Integer userStr = count; 43 Acount user = new Acount(); 44 user.setUserid(calendar.getTimeInMillis() + ""); 45 user.setUserPrincipalName("user1"); 46 user.setUsername("user1"); 47 user.setPassword("user1password"); 48 user.setEmail("user@user.com"); 49 user.setStatus(0); 50 user.setMdid("mdid"); 51 user.setLoginType(3); 52 redisTemplateService.set(userStr.toString(),user); 53 54 Acount getUser = redisTemplateService.get(userStr.toString(),Acount.class); 55 Log.info(getUser); 56 if (acountMap.size() >= 10) 57 acountMap.remove(acountMap.lastKey()); 58 acountMap.put(userStr,getUser);; 59 else 60 acountMap.put(userStr,getUser); 61 62 count++; 63 try 64 Thread.sleep(1000); 65 catch (Exception e) 66 67 68 69 70 71 72 73 74 75 public static List<VehicleDevice> getVehicleDeviceResultList(Session session) 76 List<VehicleDevice> list = new ArrayList<>(); 77 try 78 Calendar calendar = Calendar.getInstance(); 79 long start = System.currentTimeMillis();;//当前时间毫秒数 80 list = (List<VehicleDevice>) session.createQuery("from VehicleDetectResult WHERE recordtime>=‘2019-01-29 22:57:11‘") 81 .list(); 82 83 long end = System.currentTimeMillis(); 84 String aaa = MailUtils.milliSecondToTimeStr(end - start,1); 85 Log.info(aaa); 86 87 return list; 88 catch (Exception e) 89 e.printStackTrace(); // 打印错误信息 90 session.getTransaction().rollback(); // 出错将回滚事物 91 finally 92 session.close(); // 关闭Session 93 94 95 return null; 96 97 98 99 100 101 102
以上是关于SpringBoot整合Redis并完成工具类的主要内容,如果未能解决你的问题,请参考以下文章
springboot2.2.2整合redis与redis 工具类大全
REDIS00_SpringBoot整合redisRedisTemplate使用工具类的抽取
REDIS05_SpringBoot整合redisRedisTemplate操作各个基本类型工具类的抽取