首页 > 技术文章 > 记一次实现统计访问量最高文章的功能

bigsaltfish 2017-09-05 22:17 原文

   最近在公司做了一个新的需求:统计上周某几个系列文章中,阅读量最大的6篇文章。本来这些统计的功能,是要去找专门的统计,比如百度统计、友盟、谷歌等,但是我只有一天的开发时间,去研究第三方的统计指定某类文章的实现和接入,想了想,还是自己动手来实现来的快。

   自己来实现的话,我想了想方案,应该是Redis+DB+定时任务,其中,redis做两件事情:每次点击统计次数++、存储上周阅读量最多的6篇文章;DB是作为数据的备份(redis突然GG了)和防止需求变更(比如,斯比的产品突发奇想把上周的阅读量最大的6篇文章,改为上两周的阅读量最大的6篇文章,或者是一个月、一个季度的,这样的话,以前统计的数据还是在的);定时任务,就是每周的凌晨把redis中文章的count写入数据库再归零,然后把新版的“上周阅读量的6篇文章”更新到缓存。

   其中,使用到的技术和疑难点呢,貌似没有,只有JRedis的模糊查询我之前没使用过(使用的都是放字符串或者list,哈哈)、定时任务就使用的spring Quartz吧。一切都准备好了,等明天去公司在去编码吧!

下面附上redis的模糊匹配



Redis 模糊匹配 SearchKeys

语法:KEYS pattern
说明:返回与指定模式相匹配的所用的keys。
该命令所支持的匹配模式如下:
(1)?:用于匹配单个字符。例如,h?llo可以匹配hello、hallo和hxllo等;
(2)*:用于匹配零个或者多个字符。例如,h*llo可以匹配hllo和heeeello等;
(3)[]:可以用来指定模式的选择区间。例如h[ae]llo可以匹配hello和hallo,但是不能匹配hillo。
同时,可以使用“/”符号来转义特殊的字符


在java里

Jedis jedis = new Jedis("10.110.20.152", 6379);  
        Set<String> set = jedis.keys("china:shandong*");  
        for (String key : set) {  
            System.out.println(key);  
        }

Tips:

这里使用到了Keys,很烂的主意,因为在获取的时候会造成阻塞。。。建议使用scan

Jedis scan及其count的值

推荐阅读