import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.ZParams;
import java.util.*;
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private JedisCluster jedisCluster;
private static final int VOTE_SCORE = 432;
private static final int ARTICLES_PER_PAGE = 25;
private static final String prefix = "luffi:lbl";
private static final String KEY_SPLIT = ":";
@RequestMapping("/add")
public String postArticle(String title, String link, String user, String group) {
String articleid = jedisCluster.incr("articleid").toString();
long now = System.currentTimeMillis();
Map<String, String> articleinfo = new HashMap<>();
articleinfo.put("title", title);
articleinfo.put("link", link);
articleinfo.put("user", user);
articleinfo.put("time", now + "");
articleinfo.put("vote", "1");
articleinfo.put("group", group);
jedisCluster.hmset("article:" + articleid, articleinfo);
jedisCluster.zadd("{" + prefix + KEY_SPLIT + "}" + "time", Double.parseDouble(now + ""), articleid);
jedisCluster.zadd("{" + prefix + KEY_SPLIT + "}" + "score", Double.parseDouble(now + VOTE_SCORE + ""), articleid);
jedisCluster.sadd("{" + prefix + KEY_SPLIT + "}" + "group_" + group, articleid);
return articleid;
}
@RequestMapping("/articles")
public String getArticlePage(int pageNo, String key) {
if (pageNo <= 0) {
pageNo = 1;
}
int start = (pageNo - 1) * ARTICLES_PER_PAGE;
int end = start + ARTICLES_PER_PAGE - 1;
Set<String> zrange = jedisCluster.zrevrange(key, start, end);
List<Map<String, String>> list = new LinkedList<>();
zrange.stream().forEach(articltid -> {
Map<String, String> article = jedisCluster.hgetAll("article:" + articltid);
list.add(article);
});
return JSON.toJSONString(list);
}
@RequestMapping("/groupsort")
public String groupsort(String group, String sort, int pageNo) {
if (pageNo <= 0) {
pageNo = 1;
}
String key = "{" + prefix + KEY_SPLIT + "}" + sort + group;
if (!jedisCluster.exists(key)) {
ZParams zParams = new ZParams().aggregate(ZParams.Aggregate.MAX);
jedisCluster.zinterstore(key, zParams, "{" + prefix + KEY_SPLIT + "}" + group, "{" + prefix + KEY_SPLIT + "}" + sort);
jedisCluster.expire(key,10);
}
return getArticlePage(pageNo, key);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisCluster;
@RestController
@RequestMapping("/vote")
public class VoteController {
private static final int ONE_WEEK_IN_SECONDS = 7 * 86400 * 1000;
private static final int VOTE_SCORE = 432 * 1000;
private static final String prefix = "luffi:lbl";
private static final String KEY_SPLIT = ":";
@Autowired
private JedisCluster jedisCluster;
@RequestMapping("incr")
public String vote(String articleid, String user) {
long l = System.currentTimeMillis() - ONE_WEEK_IN_SECONDS;
if (jedisCluster.zscore("{" + prefix + KEY_SPLIT + "}" + "time", articleid) < l)
return "文章过了点赞时间";
Long sadd = jedisCluster.sadd("{" + prefix + KEY_SPLIT + "}" + "vote_user:" + articleid, user);
if (sadd <= 0) {
return "您已经点过赞!";
}
Long smove = jedisCluster.smove("{" + prefix + KEY_SPLIT + "}" + "opposition_user:" + articleid,"{" + prefix + KEY_SPLIT + "}" + "vote_user:" + articleid, user);
if (smove > 0) {
jedisCluster.hincrBy("article:" + articleid, "vote", 2);
jedisCluster.zincrby("{" + prefix + KEY_SPLIT + "}" + "score", VOTE_SCORE * 2, articleid);
}else {
jedisCluster.hincrBy("article:" + articleid, "vote", 1);
jedisCluster.zincrby("{" + prefix + KEY_SPLIT + "}" + "score", VOTE_SCORE , articleid);
}
return "success";
}
@RequestMapping("/decr")
public String decr(String articleid, String user) {
long l = System.currentTimeMillis() - ONE_WEEK_IN_SECONDS;
if (jedisCluster.zscore("{" + prefix + KEY_SPLIT + "}" + "time", articleid) < l)
return "文章过了点赞时间";
Long sadd = jedisCluster.sadd("{" + prefix + KEY_SPLIT + "}" + "opposition_user:" + articleid, user);
if (sadd < 0) {
return "您已经投过反对票!";
}
Long smove = jedisCluster.smove("{" + prefix + KEY_SPLIT + "}" + "vote_user:" + articleid, "{" + prefix + KEY_SPLIT + "}" + "opposition_user:" + articleid, user);
if (smove > 0) {
jedisCluster.hincrBy("article:" + articleid, "vote", -2);
jedisCluster.zincrby("{" + prefix + KEY_SPLIT + "}" + "score", -VOTE_SCORE * 2, articleid);
}else {
jedisCluster.hincrBy("article:" + articleid, "vote", -1);
jedisCluster.zincrby("{" + prefix + KEY_SPLIT + "}" + "score", -VOTE_SCORE , articleid);
}
return "success";
}
}