SpringBoot+Redis实现缓存

时间:2018-03-16 06:35:40来源:杰瑞文章网点击:作文字数:600字
1、本次实验是基于上次我写的那篇文章上修改的,所以,有些重复性的代码,我就不再赘述了。下方是我上篇文章的连接,大家可以去参考一下。 -2、 参考:SpringBoot缓存注解介绍+实战 3、这里我只贴出关键性的代码 4、所使用到的工具 IDEA,MySql、Redis、RedisManager、postman。 1、引入依赖 pom.xml org.springframework.boot spring-boot-starter-data-redis 2、application.yml redis: database: 0 host: localhost port: 6379 password: #如果没设置密码就没有密码,设置了才会有 timeout: 6000ms jedis: pool: max-active: 200 #连接池最大连接数(适用负值表示没有限制) max-wait: -1 #连接池最大阻塞等待时间(适用负值表示没有限制) max-idle: 10 #连接池中的最大空闲连接 min-idle: 0 #连接池中的最小空闲连接 3、RedisConfig @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 设置缓存有效期一小时 RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)); return RedisCacheManager .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) .cacheDefaults(redisCacheConfiguration).build(); } @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } /** * 对hash类型的数据操作 * * @param redisTemplate * @return */ @Bean public HashOperations hashOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForHash(); } /** * 对redis字符串类型数据操作 * * @param redisTemplate * @return */ @Bean public ValueOperations valueOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForValue(); } /** * 对链表类型的数据操作 * * @param redisTemplate * @return */ @Bean public ListOperations listOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForList(); } /** * 对无序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public SetOperations setOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForSet(); } /** * 对有序集合类型的数据操作 * * @param redisTemplate * @return */ @Bean public ZSetOperations zSetOperations(RedisTemplate redisTemplate) { return redisTemplate.opsForZSet(); } } 4、ServiceImpl @Service("artileService") @Slf4j public class ArtileServiceImpl implements ArtileService { @Resource private ArtileDao artileDao; @Autowired private RedisTemplate redisTemplate; /** * @Description: 分页查询 :注意这里需要进行一下对分页数据的处理 (offset-1)*limit, limit * @params: [offset, limit] * @return: java.util.List * @Author: wangxianlin * @Date: 2020/3/17 10:57 AM */ @Override public Artile queryById(int id) { ValueOperations operations = redisTemplate.opsForValue(); //判断redis中是否有键为key的缓存 boolean hasKey = redisTemplate.hasKey("artile_"+id); if (hasKey) { Artile artile = operations.get("artile_"+id); log.info("从缓存中获得数据:"+artile.getTitle()); log.info("------------------------------------"); return artile; } else { Artile artile = artileDao.queryById(id); log.info("查询数据库获得数据:"+id); log.info("------------------------------------"); // 写入缓存 operations.set(String.valueOf("artile_"+id), artile, 5, TimeUnit.HOURS); return artile; } } /** * @Description: 新增数据 * @params: [artile] * @return: int * @Author: wangxianlin * @Date: 2020/3/17 10:57 AM */ @Override public int insert(Artile artile) { return this.artileDao.insert(artile); } /** * @Description: 修改数据 :先更新数据表,成功之后,删除原来的缓存,再更新缓存 * @params: [artile] * @return: com.ustcinfo.cache.entity.Artile * @Author: wangxianlin * @Date: 2020/3/17 10:57 AM */ @Override public int update(Artile artile) { ValueOperations operations = redisTemplate.opsForValue(); int result = artileDao.update(artile); if (result != 0) { String key = "artile_" + artile.getId(); boolean haskey = redisTemplate.hasKey(key); if (haskey) { redisTemplate.delete(key); log.info("删除缓存中的key-----------> " + key); } // 再将更新后的数据加入缓存 Artile artile1 = artileDao.queryById(artile.getId()); if (artile1 != null) { operations.set(key, artile1, 3, TimeUnit.HOURS); } } return result; } /** * @Description: 根据主键删除 * @params: [id] * @return: boolean * @Author: wangxianlin * @Date: 2020/3/17 10:58 AM */ @Override public boolean deleteById(Integer id) { int result = artileDao.deleteById(id); String key = "artile_" + id; if (result != 0) { boolean hasKey = redisTemplate.hasKey(key); if (hasKey) { redisTemplate.delete(key); log.info("删除了缓存中的key:" + key); } } return result>0; } } 5、启动Redis image.png 6、测试 6.1 根据ID查询 第一次查询 image.png 第二次查询 image.png 进入redis看一下 看到已经将刚才查询的数据放入到了redis中,所以在第二次查询的时候,花费的时间会少很多。 image.png 6.2 新增 新增的时候,没有将插入的数据放进redis中。所以在redis中没有这条数据, image.png image.png 在进行查询一次。 我们可以看到,redis已经将该条数据进行缓存。 img 6.3 修改 image.png 查看redis ,我们可以看到redis缓存的数据已经发生了改变。 image.png 查询一下 image.png 6.4 删除 将刚才新增的数据进行删除 image.png 看一下redis,我们发现刚才新增的数据已经不存在了。 redis 再次查询一下 image.png
作文投稿

SpringBoot+Redis实现缓存一文由杰瑞文章网免费提供,本站为公益性作文网站,此作文为网上收集或网友提供,版权归原作者所有,如果侵犯了您的权益,请及时与我们联系,我们会立即删除!

杰瑞文章网友情提示:请不要直接抄作文用来交作业。你可以学习、借鉴、期待你写出更好的作文。

说说你对这篇作文的看法吧