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);
// }
}