package com.yunpi.doo.msvs.util;
import com.yunpi.doo.msvs.bean.knowledge.HotWord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 类说明
*
* @author chengyan
* @date 2022/11/30
*/
@Component
public class RedisUtils {
@Autowired
private RedisTemplate redisTemplate;
/**
* 设置缓存失效时间,统一为凌晨零点
* @param hotWord
* @throws Exception
*/
public void addHotWord(String hotWord) throws Exception {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR,1);
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.MILLISECOND,0);
//晚上十二点与当前时间的毫秒差
Long timeOut = (calendar.getTimeInMillis()-System.currentTimeMillis()) / 1000;
redisTemplate.expire("hotWord",timeOut, TimeUnit.SECONDS);
redisTemplate.opsForZSet().incrementScore("hotWord", hotWord, 1);
}
/**
* 获取热词前topnum位
* @return
*/
public List<HotWord> getHotWord(int topnum) {
List<HotWord> hotWordList = new ArrayList<>();
Set<ZSetOperations.TypedTuple<Object>> typedTupleSet = redisTemplate.opsForZSet().reverseRangeByScoreWithScores("hotWord",1,100);
Iterator<ZSetOperations.TypedTuple<Object>> iterator = typedTupleSet.iterator();
int flag = 0;
while (iterator.hasNext()){
flag++;
ZSetOperations.TypedTuple<Object> typedTuple = iterator.next();
String value = (String)typedTuple.getValue();
int score = (int) Math.ceil(typedTuple.getScore());
HotWord hotWord = new HotWord(value,score);
hotWordList.add(hotWord);
if ( flag >= topnum ) {break;}
}
return hotWordList;
}
}
Redis实现热搜排行榜
最新推荐文章于 2024-05-20 21:52:49 发布