java redis 實現簡單的使用者簽到功能
阿新 • • 發佈:2020-12-15
業務需求是使用者每天只能簽到一次,而且簽到後用戶增加積分,所以把使用者每次簽到時放到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);//給使用者增加積分 } }
獲取離凌晨 還有多久
/** * 獲取當前時間離明天凌晨還有多少小時 * @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); }
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); } }
以上就是java redis 實現簡單的使用者簽到功能的詳細內容,更多關於Java 實現使用者簽到功能的資料請關注我們其它相關文章!