我是靠谱客的博主 灵巧诺言,最近开发中收集的这篇文章主要介绍如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)分析vo类时间工具类控制器接口业务层实现方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 分析
  • vo类
  • 时间工具类
  • 控制器接口
  • 业务层实现方法
    • 抽出来的方法–通过此文章id找到对应的vo对象
    • 抽出来的方法–存放vo对象进redis中

  • 前提须知(一)阅读量+1和(二)收藏量+1
  • 以上2篇文章内容,使用的vo对象为同一个

分析

  • 应用场景,点击点赞按钮,则将点赞数+1,若点赞过则无法进行点赞
  • 通过redis操作, key为文章和用户id的拼接,当前用户在此redis中能找到自己对应的key则是点赞过,若无则未点赞 才能使点赞数+1
  • 设置redis中的key时效时长为当前时间到当天的最后一秒的间隔(秒)
    在这里插入图片描述

vo类

在这里插入图片描述

时间工具类

  • 提供获取当天最后一秒的时间
  • 提供获取2个时间的间隔数(秒)
public class DateUtil {
    /**
     * 获取2个时间的间隔(秒)
     * @param d1
     * @param d2
     * @return
     */
        public static long getDateBetween(Date d1, Date d2){
            return Math.abs(d1.getTime()-d2.getTime() / 1000);//取绝对值
        }
//获取当天最后一秒时间
        public static Date getEndDate(Date date){
            if (date == null){
                return null;
            }
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.set(Calendar.HOUR_OF_DAY,23);
            c.set(Calendar.MINUTE,59);
            c.set(Calendar.SECOND,59);
            return c.getTime();
        }
}

控制器接口

  • @RequireLogin 设置此接口必须登录才能访问,具体至登录拦截配置
  • 接收文章id和当前用户,返回boolean类型,true为点赞成功,false为失败
@RequireLogin
    @PostMapping("/strategyThumbup")
    public Object strategyThumbup(Long sid,@UserParam UserInfo userInfo){
        boolean b= strategyStatisVORedisService.strategyThumbup(sid,userInfo.getId());
        return JsonResult.success(b);
    }

业务层实现方法

  • 拼接当前文章id和当前用户id作为reids中的key,value值随便设即可
  • 若此key不存在redis中,则表示文章并未点赞过,则进行点赞操作,若存在则表明已点赞过,直接返回false给前端,表示点赞失败

点赞业务逻辑如下:

  • 通过文章id获取对应的vo类,将此类内的点赞量+1,然后存入redis中即可(前端的点赞量是通过redis中文章id为key对应的vo显示的)
  • 将拼接当前文章id和当前用户id作为reids中的key存入redis中,并设置时效时长为当前时间到当天最后一秒的间隔(秒), 也就是过完今天则失效了,第二天可以继续点赞
  • 最后返回true 表示点赞成功!
  public boolean strategyThumbup(Long sid, Long uid) {
//        拼接key
        String key = RedisKeys.STRATEGY_THUMB.join(uid.toString(),sid.toString());
//        判断key是否存在
        if (!template.hasKey(key)){
//        不存在,点赞数 +1 , 缓存标记[点赞操作]
            StrategyStatisVO vo = this.getStrategyVO(sid);
            vo.setThumbsupnum(vo.getThumbsupnum() + 1);
//            更新vo对象
            this.setStrategyVo(vo);
            Date now = new Date();
//        最后一秒
            Date end = DateUtil.getEndDate(now);
//           当前时间到今天最后一秒
            Long time = DateUtil.getDateBetween(now,end);
//            缓存标记
            template.opsForValue().set(key,"1",time, TimeUnit.SECONDS);
            return true;
        }

//        存在,不做任何处理[已经顶过]
        return false;
    }

抽出来的方法–通过此文章id找到对应的vo对象

 //    通过攻略文章id获取对应vo
    @Override
    public StrategyStatisVO getStrategyVO(Long sid) {
//       拼接vo的key
        String key = RedisKeys.STRATEGY_STATIS_VO.join(sid.toString());
//        获取vo对象
        StrategyStatisVO vo = null;
        if (!template.hasKey(key)) {
            //        不存在,进行vo对象初始化
            Strategy strategy = strategyService.getById(sid);
            vo = new StrategyStatisVO();
            BeanUtils.copyProperties(strategy, vo);
            vo.setStrategyId(strategy.getId());
            template.opsForValue().set(key, JSON.toJSONString(vo));
        } else {
            String voStr = template.opsForValue().get(key);
            vo = JSON.parseObject(voStr, StrategyStatisVO.class);
        }

        return vo;
    }

抽出来的方法–存放vo对象进redis中

 //将vo 存进redis
    @Override
    public void setStrategyVo(StrategyStatisVO vo) {
        //       拼接vo的key
        String key = RedisKeys.STRATEGY_STATIS_VO.join(vo.getStrategyId().toString());
//    更新vo
        template.opsForValue().set(key, JSON.toJSONString(vo));
    }

最后

以上就是灵巧诺言为你收集整理的如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)分析vo类时间工具类控制器接口业务层实现方法的全部内容,希望文章能够帮你解决如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)分析vo类时间工具类控制器接口业务层实现方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部