1.为什么需要缓存
为什么需要缓存,我相信搞开发的都能回答出来,无非就是为了降低数据库压力,节约资源,提升系统性能。而事实上也确实是,归根结底就是降压,高并发,高性能。不过,大厂里那一套高并发的东西不在本篇讲述。下面我们就spring boot 整合redis ,实现数据缓存的demo。
2.搭建Springboot工程
搭建spring boot工程,此处就不多赘述了,大家可以自己去官网下载然后导入,或者直接用idea创建。引入的核心依赖如下,另外还有其他的如mybatis,thymeleaf等。
org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-data-redis 2.3.0.RELEASE
3.Redis配置类
@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport { @Autowired private LettuceConnectionFactory lettuceConnectionFactory; @Bean public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // key采用String的序列化方式 redisTemplate.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }}
4.Redis工具类
//大家可以根据需要再自行添加方法@Componentpublic final class RedisUtil { @Autowired private RedisTemplate redisTemplate; /** * 设置缓存:无过期时间 * @param key * @param value * @return */ public boolean set(String key, Object value) { try { redisTemplate.opsForValue().set(key,value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 设置缓存:有过期时间,单位:秒 * @param key * @param value * @param time * @return */ public boolean set(String key, Object value, long time) { try { if(time > 0) { redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS); }else { throw new RuntimeException("时间必须大于0"); } return true; }catch (Exception e) { e.printStackTrace(); return false; } } /** * 普通缓存获取 * @param key 键 * @return 值 */ public Object get(String key) { return key == null ? null : redisTemplate.opsForValue().get(key); } /** * 判断key是否存在 * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key) { try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 指定key缓存失效时间 * @param key 键 * @param time 时间(秒) * @return */ public boolean expire(String key, long time) { try { if (time > 0) { redisTemplate.expire(key, time, TimeUnit.SECONDS); }else { throw new RuntimeException("时间必须大于0"); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据key 获取过期时间 * @param key 键 不能为null * @return 时间(秒) 返回0代表为永久有效 */ public long getExpire(String key) { return redisTemplate.getExpire(key, TimeUnit.SECONDS); } /** * 将list放入缓存 * @param key 键 * @param value 值 * @return */ public boolean lSet(String key, List value) { try { redisTemplate.opsForList().rightPushAll(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, List value, long time) { try { redisTemplate.opsForList().rightPushAll(key, value); if (time > 0) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } }}
5.测试
@Testvoid contextLoads() { if(redisTemplate.opsForValue().get("list") != null) { LOGGER.info("走缓存了============="); List list = (List) redisTemplate.opsForValue().get("list"); System.out.println(list); }else { LOGGER.info("走数据库了============="); List list = aaaServerService.findList(); redisTemplate.opsForValue().set("list",list); }}
我们第一次运行这个测试类,控制台打印如下图1,再运行一次,控制台打印如下图2。可以看到查询的数据从缓存中取了。我们还可以连接下redis,直接 get list,得到的结果如图3,数据的确已经存入缓存!至此,spring boot整合redis就大功告成了!
图1
图2
图3
小结
本篇文章建单的介绍了spring boot如何整合redis,相对来说,没有什么难懂的地方。对于简单的业务层面来说,这个已经足够了,更深层次的还需要大家不断的学习探索。