专栏名称: Guo_1_9
目录
相关文章推荐
51好读  ›  专栏  ›  Guo_1_9

(一)、文章投票网站的redis相关实现(Java)

Guo_1_9  · 掘金  ·  · 2018-02-12 00:50

正文

请到「今天看啥」查看全文


public String postArticle (Jedis conn, String user, String title, String link) { //1、生成一个新的文章ID String articleId = String.valueOf(conn.incr( "article:" )); //String.valueOf(int i) : 将 int 变量 i 转换成字符串 String voted = "voted:" + articleId; //2、添加到记录文章已投用户名单中, conn.sadd(voted, user); //3、设置一周为过期时间 conn.expire(voted, ONE_WEEK_IN_SECONDS); long now = System.currentTimeMillis() / 1000 ; String article = "article:" + articleId; //4、创建一个HashMap容器。 HashMap<String,String> articleData = new HashMap<String,String>(); articleData.put( "title" , title); articleData.put( "link" , link); articleData.put( "user" , user); articleData.put( "now" , String.valueOf(now)); articleData.put( "oppose" , "0" ); articleData.put( "votes" , "1" ); //5、将文章信息存储到一个散列里面。 //HMSET key field value [field value ...] //同时将多个 field-value (域-值)对设置到哈希表 key 中。 //此命令会覆盖哈希表中已存在的域。 conn.hmset(article, articleData); //6、将文章添加到更具评分排序的有序集合中 //ZADD key score member [[score member] [score member] ...] //将一个或多个 member 元素及其 score 值加入到有序集 key 当中 conn.zadd( "score:" , now + VOTE_SCORE, article); //7、将文章添加到更具发布时间排序的有序集合。 conn.zadd( "time:" , now, article); return articleId; } }

2.当用户尝试对一篇文章进行投票时,

(1)用ZSCORE命令检查记录文章发布时间的有序集合(redis设计2),判断文章的发布时间是否未超过一周。

(2)如果文章仍然处于可以投票的时间范畴,那么用SADD将用户添加到记录文章已投票用户名单的集合(redis设计4)中。

(3)如果上一步操作成功,那么说明用户是第一次对这篇文章进行投票,那么使用ZINCRBY命令为文章的评分增加432(ZINCRBY命令用于对有序集合成员的分值执行自增操作);

并使用HINCRBY命令对散列记录的文章投票数量进行更新

/**
 * 对文章进行投票
 * 实现投票系统的步骤:
 * 1、当用户尝试对一篇文章进行投票时,程序要使用ZSCORE命令检查记录文字发布时间的有序集合,判断文章的发布时间是否超过一周。
 * 2、如果文章仍然处于可投票的时间范围之内,那么程序将使用SADD命令,尝试将用户添加到记录文章的已投票用户名单的集合中。
 * 3、如果投票执行成功的话,那么说明用户是第一次对这篇文章进行投票,程序将使用ZINCYBY命令为文章的评分增加432(ZINCYBY命令用于对有序集合成员的分值进行自增操作),
 *    并使用HINCRBY命令对散列记录的文章投票数量进行更新(HINCRBY命令用于对散列存储的值执行自增操作)
 */
public void articleVote(Jedis conn, String user, String article) {
    //1、计算文章投票截止时间。
    long cutoff = (System.currentTimeMillis() / 1000) - ONE_WEEK_IN_SECONDS;
    //2、检查是否还可以对文章进行投票,(虽然使用散列也可以获取文章的发布时间,但有序集合返回文章发布时间为浮点数,可以不进行转换,直接使用)
    if (conn.zscore("time:", article) < cutoff){
        return;
    }

    //3、从articleId标识符里面取出文章ID。
    //nt indexOf(int ch,int fromIndex)函数:就是字符ch在字串fromindex位后出现的第一个位置.没有找到返加-1
    //String.Substring (Int32)	从此实例检索子字符串。子字符串从指定的字符位置开始。






请到「今天看啥」查看全文