java redis 实现用户签到功能(很普通简单的签到功能)

业务需求是用户每天只能签到一次,而且签到后用户增加积分,所以把用户每次签到时放到redis 缓存里面,然后每天凌晨时再清除缓存,大概简单思想是这样的 

直接看代码吧如下 

    @Transactional
    @Override
    public void signIn(Integer memberId) throws BizException {
        if(memberId==null){
            throw new BizException(ErrorCode.BIZ_EXCEPTION.getErrcode(), "签到用户id 不能为null");
        }
        String day =  DateFormatUtils.format(new Date(), "yyyyMMdd");
        String key = "signin:"+day;
        Boolean sismember = redisClient.sismember(key, memberId.toString());
        if(sismember){
            throw new BizException(ErrorCode.BIZ_EXCEPTION.getErrcode(), "今天已经签到了");
        }else{
            redisClient.sadd(key, memberId.toString());
            redisClient.expire(key, getRefreshTime());
            addPointsRecord(memberId,IntegralType.SIGN_IN);//给用户增加积分
        }
        
    }

2:获取离凌晨 还有多久

    /**
     * 获取当前时间离明天凌晨还有多少小时
     * @return
     */
    public static int getRefreshTime(){
        Calendar calendar = Calendar.getInstance();
        int now = (int) (calendar.getTimeInMillis()/1000);
        calendar.add(Calendar.DATE, 1);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR_OF_DAY , 0);
        return (int) (calendar.getTimeInMillis()/1000-now);
    }

3:Controller 

    /**
     * 签到
     * @return
     */
    @WeiXinLogin
    @RequestMapping("/signIn")
    public ResponseModel signIn(){
        try {
            Integer memberId = RequestContext.getContext().getUser().getMemberId();
            memberApi.signIn(memberId);
            return new ResponseModel();
        } catch (BizException e) {
            LOGGER.error("signIn error");
            return new ResponseModel(e.getErrcode(), e.getErrm(), null);
        }
    }

 

转载于:https://www.cnblogs.com/SHMILYHP/p/10137253.html

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值