java實現(xiàn)簡單點贊功能
本文實例為大家分享了java實現(xiàn)簡單點贊功能的具體代碼,供大家參考,具體內(nèi)容如下
需求分析
分析:
1.必須先登錄,否則提示
2.第一次點贊(頂),點贊操作,點贊數(shù)+1,提示頂成功
3.第二次點贊(頂),沒有操作,提示今天頂過了
核心問題:
1>怎么區(qū)分當(dāng)前請求時頂成功操作(第一次頂)還是今天已經(jīng)頂過(第二次頂)
2>怎么考慮今天已頂過
----------------------------------------------
核心問題需要區(qū)分是第一次頂還是的二次頂,這種請求操作屬于有狀態(tài)請求操作,需要后端設(shè)計一個記號,這個記號注意需要設(shè)置時效性(今天最后一秒到當(dāng)前時間間隔[單位是秒])
//如何設(shè)計記號?
方案1:可以參照之前攻略收藏記號操作方式,設(shè)計一個key,用戶uid做區(qū)分(保證唯一),value值是攻略id集合,一頂將攻略uid添加集合中
方案2:設(shè)計一個key,使用用戶uid跟攻略sid進行區(qū)分,value值隨意,需要設(shè)置有效性
實現(xiàn)步驟
1.創(chuàng)建一個點贊接口,傳入當(dāng)前點贊攻略sid,獲取當(dāng)前登錄用戶uid
2.通過sid跟uid拼接記號的key
3.判斷key是否存在
如果存在,說明今天已經(jīng)點贊(頂)過,不做任何處理,頁面提示
如果不存在,說明具體沒點贊(頂)過,獲取vo對象,點贊數(shù)屬性+1,將記號緩存到redis中,
設(shè)置過期時間:今天最后一秒到當(dāng)前時間間隔[單位是秒]
4.更新vo對象
具體實現(xiàn)
//判斷是否頂過 ? ? @Override ? ? public boolean strategyThumbup(String id, String sid) { ? ? ? ? String key = RedisKeys.USER_STRATEGY_THUMBUP.join(id, sid); ? ? ? ? //如果不包含,表示沒有頂過,執(zhí)行點贊,點贊數(shù)+1,并設(shè)置key有效時間 ? ? ? ? if (!template.hasKey(key)) { ? ? ? ? ? ? StrategyStatisVO statisVO = this.getStrategyStatisVO(sid); ? ? ? ? ? ? statisVO.setThumbsupnum(statisVO.getThumbsupnum() + 1); ? ? ? ? ? ? this.setStrategyStatisVO(statisVO); ? ? ? ? ? ? //拿到最晚時間 ? ? ? ? ? ? Date endDate = DateUtil.getEndDate(new Date()); ? ? ? ? ? ? //計算時間間隔 ? ? ? ? ? ? long time = DateUtil.getDateBetween(endDate, new Date()); ? ? ? ? ? ? //設(shè)置有效時間 ? ? ? ? ? ? template.opsForValue().set(key, "1", time, TimeUnit.SECONDS); ? ? ? ? ? ? return true; ? ? ? ? } ? ? ? ? return false; ? ? } ? ? ----------------------------------------------------------------------------------- ? ? //時間工具類 ? ? public class DateUtil { ? ? /** ? ? ?* 獲取兩個時間的間隔(秒)? ? ? ?*/ ? ? 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(); ? ? } }
小結(jié)
1.核心問題需要區(qū)分是第一次頂還是的二次頂,這種請求操作屬于有狀態(tài)請求操作
2.有狀態(tài)請求操作我們需要設(shè)置記號,問題的關(guān)鍵在于記號的設(shè)計
3.這個記號,我們也可以使用與點贊/收藏功能類似的記號,就是以用戶id為key,然后將頂?shù)奈恼耰d放到集合中為value
4.但是更推薦使用以用戶id和攻略id拼接而成的為key,value隨意取
5.我們操作時只需要判斷key是否存在,存在,我們什么操作也不用做,不存在,我們就將點贊(數(shù))+1,然后設(shè)置key的時間即可
6.最后更新vo對象
7.難點在于時間的設(shè)置,看工具類,這個key鍵設(shè)置體現(xiàn)了key鍵的唯一性,靈活性和時效性
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Sharding-Jdbc 自定義復(fù)合分片的實現(xiàn)(分庫分表)
本文主要介紹了Sharding-Jdbc 自定義復(fù)合分片的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07springboot之Duration(java.time.Duration)在yml properties中
這篇文章主要介紹了springboot之Duration(java.time.Duration)在yml properties中的配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Java.toCharArray()和charAt()的效率對比分析
這篇文章主要介紹了Java.toCharArray()和charAt()的效率對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10springboot+vue制作后臺管理系統(tǒng)項目
本文詳細介紹了后臺管理使用springboot+vue制作,以分步驟、圖文的形式詳細講解,大家有需要的可以參考參考2021-08-08Java classloader和namespace詳細介紹
這篇文章主要介紹了Java classloader和namespace詳細介紹的相關(guān)資料,需要的朋友可以參考下2017-03-03