对文章进行投票:
产生一个能够随着时间不断流失而不断减少的评分,程序需要根据文章的发布时间和当前时间来计算文章的评分,具体的计算方法为:将文章得到的支持票数 * 一个常量+文章的发布时间====文章的评分,常量为432,这个常量是通过一天的秒数(86400)/文章展示一天需要的支持票数(200)的到的。
除了计算评分之外,还需要使用redis结构存储网站上的各种信息。对网站里的每篇文章,程序都使用一个散列来存储文章标题,指向文章的网址,发布文章的用户,文章的发布时间,文章得到的投票数量等信息。

文章投票网站将使用两个有序集合来有序的存储文章:第一个有序集合的成员为文章id
分值为文章的发布时间;第二个有序集合的成员为文章id,分值为文章的评分。通过这两个有序集合,就可以按照评分进行排序和按照时间进行排序。

防止用户对同一篇文章进行多次投票,网站需要为每篇文章记录一个已经投票用户的名单。为此创建一个集合存储已投票用户的id。为了节省内存我们规定一片文章发布满一周之后就不能进行投票,文章的评分将被固定下来,而记录文章已投票用户名单的集合也将会被删除。
对文章进行分组:
群组功能由两个部分组成,一个部分负责记录文章属于哪个群组,另一个部分负责取出群组里面的文章。
为了能够根据评分对群组文章进行排序和分页,网站需要将同一个群组里面的所有文章都按照评分有序的存储到一个有序集合里面
代码实现:
public class Demo01 {
static private Jedis jedis = new Jedis("192.168.52.100",6379);
//写文章文章
@Test
public void demo01() {
String articleid = "article:100635";
String votedId = "voted:100635";
String userId = "1";
//文章的发布时间
long time = new Date().getTime();
HashMap<String,String> map = new HashMap<>();
map.put("title","demo01");
map.put("link","www.baidu.com");
map.put("poster","user:"+userId);
map.put("time",String.valueOf(time));
//点评数
map.put("votes","1");
//将作者加入到点评的集合中去
jedis.sadd(votedId,userId);
String hmset = jedis.hmset(articleid, map);
//创建两个有序集合,成员为文章id分支为评分,第二个为文章id,分支为时间。
jedis.zadd("time",time,articleid);
//分值计算
long score = time + 432;
jedis.zadd("score",score,articleid);
//加入到群组里面去
demo02();
}
@Test
public void demo02() {
//将文章id加入到分组当中去
String articleid = "article:100635";
jedis.sadd("groups:programming",articleid);
}
//读者点评
@Test
public void demo03() {
String articleid = "article:100635";
String votedId = "voted:100635";
String userId = "1";
String dianzai_Userid = "2";
//使用网站的创建时间
Date date = new Date();
long time = date.getTime();
double time1 = jedis.zscore("time", articleid);
long primDate = 7 * 24 * 60 * 60 * 1000;
if(time1 + primDate < time) {
//过期了
jedis.del(votedId);
}
//没有过期
else {
Long sadd = jedis.sadd(votedId, dianzai_Userid);
if(sadd == 0 ) {
System.out.println("已经评论过了");
}else {
System.out.println("点赞成功");
//重新进行分值+432
jedis.zincrby("score",432,articleid);
//更新文章的点赞次数
jedis.hincrBy(articleid,"votes",1);
}
}
}
//按时间排序取出前10 time
@Test
public void demo04() {
//找出前10的member
Set<String> articleid = jedis.zrange("time", 0, 10);
for (String s : articleid) {
System.out.println(s);
//在去查找文章信息
Map<String, String> map = jedis.hgetAll(s);
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("..........." + entry.getKey() + "----"+ entry.getValue());
}
}
}
//按分值排序取出前10 score
@Test
public void demo05() {
//找出前10的member
Set<String> articleid = jedis.zrange("score", 0, 10);
for (String s : articleid) {
System.out.println(s);
//在去查找文章信息
Map<String, String> map = jedis.hgetAll(s);
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("..........." + entry.getKey() + "----"+ entry.getValue());
}
}
}
//对分组和time进行交集,求有序集合
@Test
public void demo06() {
//不存在进行交集
if(!jedis.exists("time:programming")) {
ZParams params = new ZParams();
params.aggregate(ZParams.Aggregate.MAX);
params.weightsByDouble(1, 1);
Long time = jedis.zinterstore("time:programming", params, "groups:programming", "time");
System.out.println("重新求交集");
//为了进行优化,我们选择将有序集合缓存1分钟
jedis.expire("time:programming",60);
}
else {
//使用缓存
System.out.println("使用缓存");
}
}
//对分组和score进行交集,求有序集合
@Test
public void demo07() {
//不存在进行交集
if(!jedis.exists("score:programming")) {
ZParams params = new ZParams();
params.aggregate(ZParams.Aggregate.MAX);
params.weightsByDouble(1, 1);
Long time = jedis.zinterstore("score:programming", params, "groups:programming", "score");
System.out.println("重新求交集");
//为了进行优化,我们选择将有序集合缓存1分钟
jedis.expire("score:programming",60);
}
else {
//使用缓存
System.out.println("使用缓存");
}
}
}
当然这里的美中不足之处在于我们没有使用事物。