如何使用redis实现(三) 文章点赞量+1(一天只能点一次且无法取消)

分析

  • 应用场景,点击点赞按钮,则将点赞数+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));
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值