點贊功能模組-獲取使用者詳情與點贊過的歷史文章

守望精靈發表於2020-10-21

內容一:選擇的資料結構同樣也是雜湊!!

內容二:使用者的維度~儲存點贊過的歷史文章(其中為了減少二次加工,對Field做了小技巧的處理..)~儲存的邏輯要適用於"點贊"與“取消點贊"的場景

內容:直接從快取的SortedSet獲取即可,獲取出Field後,需要作分隔符的小處理

以使用者為維度,快取使用者點贊過的歷史文章

key=儲存到redis的標誌符;field=使用者id-文章id,value=文章標題

PraiseService.java

 private void cacheUserPraiseArticle(final PraiseDto dto,Boolean isOn){
        final String fieldKey=dto.getUserId()+SplitChar+dto.getArticleId();

        HashOperations<String,String,String> hash=redisTemplate.opsForHash();
        if (isOn){
            hash.put(Constant.RedisArticleUserPraiseKey,fieldKey,dto.getTitle());
        }else{
            hash.put(Constant.RedisArticleUserPraiseKey,fieldKey,"");
        }
    }


    //以使用者為維度~獲取使用者詳情以及點贊過的歷史文章
    public Map<String,Object> getUserArticles(final Integer currUserId) throws Exception{
        Map<String,Object> resMap=Maps.newHashMap();

        //使用者詳情-直接db查詢
        resMap.put("userInfo~使用者詳情",userMapper.selectByPrimaryKey(currUserId));

        //使用者點贊過的歷史文章-查redis的hash
        List<PraiseDto> userArticles=Lists.newLinkedList();
        HashOperations<String,String,String> hash=redisTemplate.opsForHash();
        //field-value對
        Map<String,String> map=hash.entries(Constant.RedisArticleUserPraiseKey);
        for (Map.Entry<String, String> entry:map.entrySet()){
            String field=entry.getKey();//使用者ID-文章ID
            String value=entry.getValue();//文章標題

            String[] arr=StringUtils.split(field,SplitChar);

            //判斷 “文章標題是否為空” - 如果為空,則代表已經取消點讚了
            if (StringUtils.isNotBlank(value)){
                //判斷當前 arr[0] 是否為當前使用者id,如果是,則代表 arr[1] 為當前使用者點贊過的文章id
                if (currUserId.toString().equals(arr[0])){
                    userArticles.add(new PraiseDto(currUserId,Integer.valueOf(arr[1]),value));
                }
            }
        }
        resMap.put("userPraiseArticles~使用者點贊過的歷史文章",userArticles);

        return resMap;
    }

 

相關文章