失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Redis+SpringBoot实现置顶帖缓存

Redis+SpringBoot实现置顶帖缓存

时间:2021-07-01 03:28:01

相关推荐

Redis+SpringBoot实现置顶帖缓存

步骤

1.通过服务器或者本地虚拟机开通redis缓存服务。

2.项目映入redis和连接池依赖。

3.在项目的配置文件中配置redis,例如,ip地址,端口号,和database和连接池属性。

4.定义redis配置类,字符串序列化。

@EnableCaching@Configurationpublic class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();//字符传序列化。redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//hash的Key也要string化redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}}

5.写redis工具类。

6.重写service业务层逻辑,如下所示。

判断redis中有无对应Key,有则获取;没有就从数据库找,再存放于缓存中即可。

这里要注意lrange方法查到的list里面存的还是list需要调用get方法才能拿到合适的list数据。

public PaginationDTO list(String search, String tag, String sort, Integer page, Integer size) {//先查置顶的,再查非置顶的,然后在分页。if (StringUtils.isNotBlank(search)) {//通过空格分割String[] tags = StringUtils.split(search, ' ');search = Arrays.stream(tags).collect(Collectors.joining("|"));}PaginationDTO paginationDTO = new PaginationDTO();//通过拓展方法带search查找QuestionQueryDTO questionQueryDTO = new QuestionQueryDTO();questionQueryDTO.setSearch(search);questionQueryDTO.setTag(tag);//sortfor (SortEnum sortEnum : SortEnum.values()) {if (sortEnum.name().toLowerCase().equals(sort)) {questionQueryDTO.setSort(sort);break;}}//查找所有问题List<QuestionDTO> questionDTOList = new ArrayList<>();//缓存int toppingSize = 0;Boolean topKey = redisService.hasKey("topKey");if (topKey == false) {//查找置顶数据List<Question> toppings = questionExtMapper.selectTopping();if (toppings != null && toppings.size() != 0) {List<QuestionDTO> questionDTOS = new ArrayList<>();for (Question topping : toppings) {User user = userMapper.selectByPrimaryKey(topping.getCreator());QuestionDTO questionDTO = new QuestionDTO();BeanUtils.copyProperties(topping, questionDTO);questionDTO.setUser(user);questionDTOS.add(questionDTO);}redisService.lPush("topKey", questionDTOS, 60);//秒toppingSize = questionDTOS.size();if (page == 1) {questionDTOList.addAll(questionDTOS);}}} else {List<Object> topKeyLists = redisService.lRange("topKey", 0, -1);List<QuestionDTO> list = (List<QuestionDTO>) topKeyLists.get(0);toppingSize = list.size();if (page == 1) {questionDTOList.addAll(list);}}//查找非置顶个数+置顶个数Integer totalCount = questionExtMapper.countBySearch(questionQueryDTO) + toppingSize;if (totalCount % size == 0) {totalPage = totalCount / size;} else if (totalCount < size) {totalPage = 1;} else {totalPage = totalCount / size + 1;}if (page < 1) {page = 1;}if (page > totalPage) {page = totalPage;}paginationDTO.setPagination(totalPage, page);//加分页,offset不能为负Integer offset = page < 1 ? 0 : size * (page - 1);questionQueryDTO.setOffset(offset);questionQueryDTO.setSize(size);//数据库List<Question> questions = questionExtMapper.selectBySearch(questionQueryDTO);for (Question question : questions) {User user = userMapper.selectByPrimaryKey(question.getCreator());QuestionDTO questionDTO = new QuestionDTO();//利用工具类,把前者赋值到后者BeanUtils.copyProperties(question, questionDTO);questionDTO.setDescription("");questionDTO.setUser(user);questionDTOList.add(questionDTO);}//重新把值赋进去paginationDTO.setData(questionDTOList);return paginationDTO;}

如果觉得《Redis+SpringBoot实现置顶帖缓存》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。