微博热搜榜rss订阅,微博热搜榜趋势报告
00-1010技术模拟思路:第一步:初始化一个月的历史数据;第二步:定期刷新数据;第三步:排行榜查询界面。
00-1010用26个英文字母实现排名,每个字母随机生成一个随机数作为分数。
为了获得更好的体验,先做几件事:
先初始化一个月的历史数据5秒,模拟微博的热度刷新(比如模拟赞和评论的热度值更新)1小时,结合每日、每周、每月的排名统计。
目录
@ Service @ SLF 4j public class InitService { @ Autowired private redis template redis template;/* * *首先初始化1个月的历史数据*/public void init30day(){ //计算当前小时keylonghour=system。current time millions()/(1000 * 60 * 60);//初始化近30天,每天24 key for(int I=1;i24 * 30I ){ //向后过去30天string key=constants . hour _ key(hour-I);this . init member(key);system . out . println(key);}}/* * *初始化key */public void init成员(string key){ random rand=new random();//使用26个英文字母实现排名,为每个字母随机生成一个随机数作为得分for(int I=1;i=26I){ this . redis template . ops forzset()。add(key,String.valueOf((char)(96 i)),rand . nextint(10));} }}
技术模拟思路:
@ Service @ SLF 4j public class TaskService { @ Autowired private redis template redis template;/** *2.计时5秒,模拟微博热度刷新(比如模拟赞和评论热度值的更新)* 3。计时1小时,结合每日、每周、每月排名。*/@ post construct public void init(){ log . info(开始初始化..);//2.计时5秒,模拟微博的热度刷新(比如模拟喜欢评论的热度值更新)new thread(()-this .refreshdatah小时())。start();//3.固定时间1小时巩固和统计日、周、月排行榜。新线程(()-this.refreshData())。start();}/* * *使用26个英文字母实现排名,每个字母随机生成一个随机数作为分数*/public void刷新小时(){//计算当前小时key longhour=system . current time millis()/(1000 * 60 * 60);//对26个英文字母进行排名,为每个字母随机生成一个随机数作为score Random rand=new Random();for(int I=1;i=26I){//Redis的ZINCRBY加上这个整数值this.redistemplate.opsforzset()。IncrementScore(constants . hour _ key hour,string.valueof ((char) (96I)),rand . nextint(10));}}/* * *刷新当日统计*/public void刷新日(){ longhour=system . current time millions()/(1000 * 60 * 60);ListString other keys=new ArrayList();//计算最近24小时内的密钥
for(int i=1;i<23;i++){ String key=Constants.HOUR_KEY+(hour-i); otherKeys.add(key); } //把当前的时间key,并且把后推23个小时,共计近24小时,求出并集存入Constants.DAY_KEY中 //redis ZUNIONSTORE 求并集 this.redisTemplate.opsForZSet().unionAndStore(Constants.HOUR_KEY+hour,otherKeys,Constants.DAY_KEY); //设置当天的key 40天过期,不然历史数据浪费内存 for(int i=0;i<24;i++){ String key=Constants.HOUR_KEY+(hour-i); this.redisTemplate.expire(key,40, TimeUnit.DAYS); } log.info("天刷新完成.........."); } /** *刷新7天的统计数据 */ public void refreshWeek(){ long hour=System.currentTimeMillis()/(1000*60*60); List<String> otherKeys=new ArrayList<>(); //算出近7天内的key for(int i=1;i<24*7-1;i++){ String key=Constants.HOUR_KEY+(hour-i); otherKeys.add(key); } //把当前的时间key,并且把后推24*7-1个小时,共计近24*7小时,求出并集存入Constants.WEEK_KEY中 this.redisTemplate.opsForZSet().unionAndStore(Constants.HOUR_KEY+hour,otherKeys,Constants.WEEK_KEY); log.info("周刷新完成.........."); } /** *刷新30天的统计数据 */ public void refreshMonth(){ long hour=System.currentTimeMillis()/(1000*60*60); List<String> otherKeys=new ArrayList<>(); //算出近30天内的key for(int i=1;i<24*30-1;i++){ String key=Constants.HOUR_KEY+(hour-i); otherKeys.add(key); } //把当前的时间key,并且把后推24*30个小时,共计近24*30小时,求出并集存入Constants.MONTH_KEY中 this.redisTemplate.opsForZSet().unionAndStore(Constants.HOUR_KEY+hour,otherKeys,Constants.MONTH_KEY); log.info("月刷新完成.........."); } /** *定时1小时合并统计 天、周、月的排行榜。 */ public void refreshData(){ while (true){ //刷新当天的统计数据 this.refreshDay();// 刷新7天的统计数据 this.refreshWeek();// 刷新30天的统计数据 this.refreshMonth(); //TODO 在分布式系统中,建议用xxljob来实现定时 try { Thread.sleep(1000*60*60); } catch (InterruptedException e) { e.printStackTrace(); } } } /** *定时5秒钟,模拟微博的热度刷新(例如模拟点赞 收藏 评论的热度值更新) */ public void refreshDataHour(){ while (true){ this.refreshHour(); //TODO 在分布式系统中,建议用xxljob来实现定时 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }}
步骤3:排行榜查询接口
@RestController@Slf4jpublic class Controller { @Autowired private RedisTemplate redisTemplate; @GetMapping(value = "/getHour") public Set getHour() { long hour=System.currentTimeMillis()/(1000*60*60); //ZREVRANGE 返回有序集key中,指定区间内的成员,降序。 Set<ZSetOperations.TypedTuple<Integer>> rang= this.redisTemplate.opsForZSet().reverseRangeWithScores(Constants.HOUR_KEY+hour,0,30); return rang; } @GetMapping(value = "/getDay") public Set getDay() { Set<ZSetOperations.TypedTuple<Integer>> rang= this.redisTemplate.opsForZSet().reverseRangeWithScores(Constants.DAY_KEY,0,30); return rang; } @GetMapping(value = "/getWeek") public Set getWeek() { Set<ZSetOperations.TypedTuple<Integer>> rang= this.redisTemplate.opsForZSet().reverseRangeWithScores(Constants.WEEK_KEY,0,30); return rang; } @GetMapping(value = "/getMonth") public Set getMonth() { Set<ZSetOperations.TypedTuple<Integer>> rang= this.redisTemplate.opsForZSet().reverseRangeWithScores(Constants.MONTH_KEY,0,30); return rang; }}
到此这篇关于springboot+redis实现微博热搜排行榜的示例代码的文章就介绍到这了,更多相关springboot redis微博热搜排行榜内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。