构建一个文章投票网站,一般具备下面几个功能
发布文章
文章投票评分(按投票多少进行评分)
文章排序(按发布时间,按评分高低)
文章分组(如专题)
…
其中用户,组两个表简单化处理了。业务实现起来也相当简单。不再赘述重。点是如何使用复述,实现类似的业务逻辑。
由于复述是基于键-值管理,属于列式数据库。和关系型数据库实现方式差异较大,值得研究。
复述的设计,最重要的一部分工作就是关键的命名以及键值数据类型的选择上。
引用>
关系型数据库属于二维,数据关系主要通过在行和列两者说明,而复述中的数据关系,则通过键键值描述,所以要求复述,键值具备层次性。
2.1文章发布
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文章投票
实现代码
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