Redis使用zset结构实现点赞等

该代码段展示了如何利用Spring Data Redis组件在Java中实现浏览计数和点赞功能。`ViewRedis`类用于处理文章浏览次数的增删查改,包括每日浏览量和总浏览量的统计。`LikeRedis`类则处理文章点赞操作,包括点赞增加、取消、查询等。这两个类都依赖于`StringRedisTemplate`来操作Redis数据。
摘要由CSDN通过智能技术生成
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<ZSetOperations.TypedTuple<String>> getAllPaperNumber(){
        //返回集合内元素的排名,以及分数(从大到小)
        Set<ZSetOperations.TypedTuple<String>> revereseTuples = stringRedisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.VIEW_FLAG.getFlag(), 0, -1);
        return revereseTuples;
    }

    //获取30天内文章的总浏览数
    public Double getThirtyViewSum(Long userId){
        Double count = 0d;
        List<Integer> userPapers = userRedis.getUserPapers(userId);
        List<String> 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<String ,Double> map =new LinkedHashMap<>();
        DaliyThirtyVO daliyThirtyVO = new DaliyThirtyVO();
        String[] dateList = new String[30];
        Double[] valueList = new Double[30];
        List<Integer> userPapers = userRedis.getUserPapers(userId);
        int num = 0;
        List<String> 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<String> getThirtyDays(Date time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<String> 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<String,Double> getAllPaperDailyViewCount(){
        HashMap<String,Double> finMap = Maps.newHashMap();
        Set<ZSetOperations.TypedTuple<String>> revereseTuples = stringRedisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.VIEW_FLAG.getFlag(), 0, -1);
        for (ZSetOperations.TypedTuple<String> 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<ZSetOperations.TypedTuple<String>> getAllPaperNumber(){
    //返回集合内元素的排名,以及分数(从大到小)
        Set<ZSetOperations.TypedTuple<String>> revereseTuples = redisTemplate.opsForZSet().reverseRangeWithScores(RedisFlag.LIKE_FLAG.getFlag(), 0, -1);
        return revereseTuples;
    }


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


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


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值