1. 程式人生 > 程式設計 >java redis 實現簡單的使用者簽到功能

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);//給使用者增加積分
  }
  
 }

獲取離凌晨 還有多久

/**
  * 獲取當前時間離明天凌晨還有多少小時
  * @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 實現使用者簽到功能的資料請關注我們其它相關文章!