Redis使用zset结构实现点赞等

Redis使用zset结构实现点赞等,第1张

package com.inesa.knowledgeBase.business.server.utils;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.inesa.knowledgeBase.model.out.DaliyThirtyVO;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;

@Component
@Data
public class ViewRedis {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private UserRedis userRedis;

//    private final String VIEW_FLAG = "view_flag";



    //创建   浏览数量
    //向集合中插入元素,并设置分数
    public void createPaperNumber(Long paperId){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //数量  +  时间
        String date = sdf.format(new Date().getTime());
        stringRedisTemplate.opsForZSet().add(RedisFlag.VIEW_FLAG.getFlag()+paperId,date,0);
        stringRedisTemplate.opsForZSet().add(RedisFlag.VIEW_FLAG.getFlag(),String.valueOf(paperId),0);
    }

    //用户浏览
    public void addUserView(Long paperId,Long userId){
        stringRedisTemplate.opsForZSet().add(RedisFlag.VIEW_FLAG.getFlag()+paperId,userId+"",1);
    }


    //增加浏览次数
    public void addViewNumber(Long paperId){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(new Date().getTime());
        stringRedisTemplate.opsForZSet().incrementScore(RedisFlag.VIEW_FLAG.getFlag()+paperId, date, 1);
        stringRedisTemplate.opsForZSet().incrementScore(RedisFlag.VIEW_FLAG.getFlag(),String.valueOf(paperId),1);
    }

     //获取单个文章浏览次数
    public Double getViewSingleCountNumber(Long paperId){
        //获得指定元素的分数
        Double score = stringRedisTemplate.opsForZSet().score(RedisFlag.VIEW_FLAG.getFlag(),String.valueOf(paperId));
        return score == null ? 0d: score;
    }

    //获取某个文章每日浏览总次数
    public Double getDailyViewCount(Long paperId){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(new Date().getTime());
        Double score = stringRedisTemplate.opsForZSet().score(RedisFlag.VIEW_FLAG.getFlag()+paperId, date);
        return score == null ? 0d: score;
    }

    //获取全部文章(排序降序
    public Set> getAllPaperNumber(){
        //返回集合内元素的排名,以及分数(从大到小)
        Set> revereseTuples = stringRedisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.VIEW_FLAG.getFlag(), 0, -1);
        return revereseTuples;
    }

    //获取30天内文章的总浏览数
    public Double getThirtyViewSum(Long userId){
        Double count = 0d;
        List userPapers = userRedis.getUserPapers(userId);
        List thirtyDays = getThirtyDays(new Date());
        for (Integer paperId : userPapers) {
            for (String date : thirtyDays) {
                Double score = stringRedisTemplate.opsForZSet().score(RedisFlag.VIEW_FLAG.getFlag() + paperId, date);
                if(score != null){
                    count = score + count;
                }
            }
        }
        return count;
    }


    //获取30天内,每天的浏览次数
    public DaliyThirtyVO getDaily30ViewCount(Long userId){
//        LinkedHashMap map =new LinkedHashMap<>();
        DaliyThirtyVO daliyThirtyVO = new DaliyThirtyVO();
        String[] dateList = new String[30];
        Double[] valueList = new Double[30];
        List userPapers = userRedis.getUserPapers(userId);
        int num = 0;
        List thirtyDays = getThirtyDays(new Date());
        for (String date : thirtyDays) {
            Double count = 0d;
            dateList[num] = date;
            for (Integer paperId : userPapers) {
                Double score = stringRedisTemplate.opsForZSet().score(RedisFlag.VIEW_FLAG.getFlag() + paperId, date);
                if(score != null){
                    count += score;
                }
            }
            valueList[num++] = count;
        }
        daliyThirtyVO.setDate(dateList);
        daliyThirtyVO.setValue(valueList);
        return daliyThirtyVO;
    }


    //获取一个前30天的集合
    /**
     * 获取当天的30天前的时间
     * @param time
     * @return
     */
    public static List getThirtyDays(Date time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List dateList = Lists.newArrayList();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        for (int i = 30; i >= 1; i--) {
            calendar.add(calendar.DAY_OF_MONTH, -1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            String date = sdf.format(calendar.getTime());
            dateList.add(date);
        }
        return dateList;
        //return calendar.getTime();
        //return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }


    //获取所有文章当日的所有浏览量
    public HashMap getAllPaperDailyViewCount(){
        HashMap finMap = Maps.newHashMap();
        Set> revereseTuples = stringRedisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.VIEW_FLAG.getFlag(), 0, -1);
        for (ZSetOperations.TypedTuple revereseTuple : revereseTuples) {
            String id = revereseTuple.getValue();
            Double dailyViewCount = getDailyViewCount(Long.parseLong(id));
            finMap.put(id,dailyViewCount);
        }
        return finMap;
    }

}

实现浏览👆

实现点赞👇

package com.inesa.knowledgeBase.business.server.utils;

import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Set;

@Component
@Data
public class LikeRedis {

    @Autowired
    private StringRedisTemplate redisTemplate;

//    private final String LIKE_FLAG = "like_flag";
//
//    private final String LIKE_DATE = "like_date";

    //创建   点赞数量
    //向集合中插入元素,并设置分数
    public void createPaperNumber(Long paperId){
        //数量
        redisTemplate.opsForZSet().add(RedisFlag.LIKE_FLAG.getFlag(),  String.valueOf(paperId), 0);

        Calendar calendar=Calendar.getInstance();
        long timeInMillis = calendar.getTimeInMillis();
        redisTemplate.opsForZSet().add(RedisFlag.LIKE_DATE.getFlag(),  String.valueOf(paperId), timeInMillis);
    }


    //增加点赞   用户点赞
    public void addLIkeNumber(Long paperId,Long userId){
        //文章总点赞
        redisTemplate.opsForZSet().incrementScore(RedisFlag.LIKE_FLAG.getFlag(),  String.valueOf(paperId), 1);
        redisTemplate.opsForZSet().add(RedisFlag.LIKE_FLAG.getFlag()+paperId,userId+"",1);
    }

    //取消点赞
    public void cancelLIkeNumber(Long paperId,Long userId){
        redisTemplate.opsForZSet().incrementScore(RedisFlag.LIKE_FLAG.getFlag(),  String.valueOf(paperId), -1);
        redisTemplate.opsForZSet().add(RedisFlag.LIKE_FLAG.getFlag()+paperId,userId+"",0);
    }

    //获取单个文章点赞次数
    public Double getLikeSingleCountNumber(Long paperId){
        //获得指定元素的分数
        Double score = redisTemplate.opsForZSet().score(RedisFlag.LIKE_FLAG.getFlag(), String.valueOf(paperId));
        return score;
    }

    //查询该用户是否点赞
    public Double likeOrNotByUser(Long paperId,Long userId){
        Double score = redisTemplate.opsForZSet().score(RedisFlag.LIKE_FLAG.getFlag() + paperId, userId + "");
        return score;
    }

    //获取全部文章(排序降序
    public  Set> getAllPaperNumber(){
    //返回集合内元素的排名,以及分数(从大到小)
        Set> revereseTuples = redisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.LIKE_FLAG.getFlag(), 0, -1);
        return revereseTuples;
    }


    //获取全部文章(排序降序
    public  Set> getAllPaperDate(){
        //返回集合内元素的排名,以及分数(从大到小)
        Set> revereseTuples = redisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.LIKE_DATE.getFlag(), 0, -1);
        return revereseTuples;
    }


    //获取每个文章的点赞数量
//    public void getAllPaperLikeCount(){
//        Set> revereseTuples = redisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.LIKE_FLAG.getFlag(), 0, -1);
//    }


}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/889977.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-14
下一篇2022-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存