复述,应用场景(1)一个文字投票网站

  

构建一个文章投票网站,一般具备下面几个功能

发布文章

文章投票评分(按投票多少进行评分)

文章排序(按发布时间,按评分高低)

文章分组(如专题)



复述应用场景(1)一个文字投票网站

其中用户,组两个表简单化处理了。业务实现起来也相当简单。不再赘述重。点是如何使用复述,实现类似的业务逻辑。

由于复述是基于键-值管理,属于列式数据库。和关系型数据库实现方式差异较大,值得研究。

复述的设计,最重要的一部分工作就是关键的命名以及键值数据类型的选择上。

关系型数据库属于二维,数据关系主要通过在行和列两者说明,而复述中的数据关系,则通过键键值描述,所以要求复述,键值具备层次性。

复述应用场景(1)一个文字投票网站

2.1文章发布

复述应用场景(1)一个文字投票网站”> <br/> </p> <p>实现代码<br/> </p> <pre类= private  static  final  int  ONE_WEEK_IN_SECONDS =, 7, *, 86400;   private  static  final  int  VOTE_SCORE =, 432;   public  String  postArticle (Jedis ,康涅狄格州,String 用户,String 标题,String 链接),{   ,,,String  articleId =, String.valueOf (conn.incr(“文章:”);      ,,,String  voted =,“投票:“,+,正如;   ,,,conn.sadd(投票,用户);   ,,,conn.expire(投票,ONE_WEEK_IN_SECONDS);//一周的有效期      ,,,long 你=,System.currentTimeMillis (),/, 1000;   ,,,String  article =,,“文章:+,正如;   ,,,HashMap<字符串,String>, articleData =, new  HashMap<字符串,String> ();   ,,,articleData.put(“标题”,标题);   ,,,articleData.put(“链接”,链接);   ,,,articleData.put(“用户”,用户);   ,,,articleData.put(“现在”,String.valueOf(现在));   ,,,articleData.put(“选票”,“1”);   ,,,conn.hmset(文章,articleData);   ,,,//维护两个排序集合,是为了解决文章排序的两种方式   ,,,//如果还有三种排序方式,对不起,还需要另外维护一个排序集合   ,,,conn.zadd(分数:,,你+,VOTE_SCORE,,文章);//维护文章的评分信息   ,,,conn.zadd(时间:,,现在,,文章);//维护文章的发布时间信息   ,,,return 正如;   }

2.2文章投票

复述应用场景(1)一个文字投票网站

实现代码

public  void  articleVote (Jedis ,康涅狄格州,String 用户,String 文章),{   ,,,long  cutoff =, (System.currentTimeMillis(),/, 1000),安康;ONE_WEEK_IN_SECONDS;   ,,,if  (conn.zscore(时间:,,文章),& lt;,截止){   ,,,,,,,返回;   ,,,}      ,,,String  articleId =, article.substring (article.indexOf (“:”), +, 1);   ,,,//维护投票的一次性   ,,,if  (conn.sadd(“投票:“,+,正如,,用户),==,1),{   ,,,,,,,conn.zincrby (VOTE_SCORE,“分数:”,文章);   ,,,,,,,conn.hincrBy(文章,“选票”,1 l);   ,,,}   }


2.3返回文章列表

两种排序策略:按发布时间,按文章评分。

支持分页排序。

复述的实现排序方式和关系型数据库中的实现方式有很大差别,这也是键值数据库的一大特点。

基于关键操作。

public  List祝辞,getArticles (Jedis ,康涅狄格州,int 页面,String 顺序),{   ,,,int  start =, (page 安康;1),*,ARTICLES_PER_PAGE;   ,,,int 最终获得=,start  +, ARTICLES_PER_PAGE 作用;1;   ,,,//从排序集合中获取id列的表   ,,,Set, ids =, conn.zrevrange(订单,,开始,结束);   ,,,List祝辞,articles =, new  ArrayList在();   ,,,//遍历id列表,逐条初始化   ,,,for  (String  id : ids) {   ,,,,,,,Map<字符串,String>, articleData =, conn.hgetAll (id);   ,,,,,,,articleData.put (“id”, id);   ,,,,,,,articles.add (articleData);   ,,,}   ,,,//注意:返回的信息中,没有列表总数   ,,,return 文章;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

复述,应用场景(1)一个文字投票网站