java redis 實(shí)現(xiàn)簡(jiǎn)單的用戶簽到功能
業(yè)務(wù)需求是用戶每天只能簽到一次,而且簽到后用戶增加積分,所以把用戶每次簽到時(shí)放到redis 緩存里面,然后每天凌晨時(shí)再清除緩存,大概簡(jiǎn)單思想是這樣的
直接看代碼吧如下
@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(), '今天已經(jīng)簽到了'); }else{ redisClient.sadd(key, memberId.toString()); redisClient.expire(key, getRefreshTime()); addPointsRecord(memberId,IntegralType.SIGN_IN);//給用戶增加積分 } }
獲取離凌晨 還有多久
/** * 獲取當(dāng)前時(shí)間離明天凌晨還有多少小時(shí) * @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 實(shí)現(xiàn)簡(jiǎn)單的用戶簽到功能的詳細(xì)內(nèi)容,更多關(guān)于Java 實(shí)現(xiàn)用戶簽到功能的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 測(cè)試模式 - XSL教程 - 52. python b站視頻下載的五種版本3. 如何通過(guò)vscode運(yùn)行調(diào)試javascript代碼4. 解決Java中的java.io.IOException: Broken pipe問(wèn)題5. Python結(jié)合百度語(yǔ)音識(shí)別實(shí)現(xiàn)實(shí)時(shí)翻譯軟件的實(shí)現(xiàn)6. JAVA抽象類及接口使用方法解析7. python如何寫個(gè)俄羅斯方塊8. 《CSS3實(shí)戰(zhàn)》筆記--漸變?cè)O(shè)計(jì)(一)9. 教你JS更簡(jiǎn)單的獲取表單中數(shù)據(jù)(formdata)10. vue實(shí)現(xiàn)簡(jiǎn)易圖片左右旋轉(zhuǎn),上一張,下一張組件案例
