redis应用场景(1)一个文字投票网站
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,构建一个文章投票网站,一般具备下面几个功能发布文章文章投票评分(按投票多少进行评分)文章排序(按发布时间,按评分高低)文章分组(如专题)...1.关系型数据库设计其中用户,组两个表简单化处理了。业务实
千家信息网最后更新 2026年11月03日redis应用场景(1)一个文字投票网站
构建一个文章投票网站,一般具备下面几个功能
发布文章
文章投票评分(按投票多少进行评分)
文章排序(按发布时间,按评分高低)
文章分组(如专题)
...
1.关系型数据库设计
其中用户,组两个表简单化处理了。业务实现起来也相当简单。不再赘述。重点是如何使用redis实现类似的业务逻辑。
由于redis是基于key-value管理,属于列式数据库。和关系型数据库实现方式差异较大,值得研究。
redis的设计,最重要的一部分工作就是key的命名以及键值数据类型的选择上。
2.Redis设计
关系型数据库属于二维,数据关系主要通过在行和列两者说明,而redis中的数据关系,则通过key键值描述,所以要求redis键值具备层次性。
2.1文章发布
实现代码
private static final int ONE_WEEK_IN_SECONDS = 7 * 86400;private static final int VOTE_SCORE = 432;public String postArticle(Jedis conn, String user, String title, String link) { String articleId = String.valueOf(conn.incr("article:")); String voted = "voted:" + articleId; conn.sadd(voted, user); conn.expire(voted, ONE_WEEK_IN_SECONDS);//一周的有效期 long now = System.currentTimeMillis() / 1000; String article = "article:" + articleId; HashMap articleData = new HashMap(); articleData.put("title", title); articleData.put("link", link); articleData.put("user", user); articleData.put("now", String.valueOf(now)); articleData.put("votes", "1"); conn.hmset(article, articleData); //维护两个排序集合,是为了解决文章排序的两种方式 //如果还有三种排序方式,对不起,还需要另外维护一个排序集合 conn.zadd("score:", now + VOTE_SCORE, article);//维护文章的评分信息 conn.zadd("time:", now, article);//维护文章的发布时间信息 return articleId;} 2.2文章投票
实现代码
public void articleVote(Jedis conn, String user, String article) { long cutoff = (System.currentTimeMillis() / 1000) - ONE_WEEK_IN_SECONDS; if (conn.zscore("time:", article) < cutoff){ return; } String articleId = article.substring(article.indexOf(':') + 1); //维护投票的一次性 if (conn.sadd("voted:" + articleId, user) == 1) { conn.zincrby("score:", VOTE_SCORE, article); conn.hincrBy(article, "votes", 1l); }}2.3返回文章列表
两种排序策略:按发布时间,按文章评分。
支持分页排序。
redis的实现排序方式和关系型数据库中的实现方式有很大差别,这也是key-value数据库的一大特点。
基于key操作。
public List
2.4 文章分组
这一块逻辑相对独立,仅仅是文章的一个分析维度而已,操作起来相对简单。就是维护groups:${group}集合。
public void addGroups(Jedis conn, String articleId, String[] toAdd) { String article = "article:" + articleId; for (String group : toAdd) { conn.sadd("group:" + group, article); }}//排序麻烦些public List> getGroupArticles(Jedis conn, String group, int page, String order) { String key = order + group;//60秒的有效期 if (!conn.exists(key)) { ZParams params = new ZParams().aggregate(ZParams.Aggregate.MAX); conn.zinterstore(key, params, "group:" + group, order); //有序集合,与group的交集,生成新的集合 conn.expire(key, 60); //60秒的有效期,性能和实时性的平衡,需要具体情况具体分析 } return getArticles(conn, page, key);} zinterstore API
public java.lang.Long zinterstore(java.lang.String dstkey,
redis.clients.jedis.ZParams params,
java.lang.String... sets)
参照资源
《redis in action》
文章
排序
数据
数据库
投票
方式
评分
有效
信息
时间
有效期
设计
业务
两个
代码
就是
逻辑
分析
分组
在行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网络科技
互联网科技有限公司图片
互联网金融公司科技
百单互联网科技有限公司
米客互联网科技
融贸通互联网科技
恒生科技互联网指数分析
赶超互联网科技 微信多开
湖南一路畅行互联网科技
崇明区互联网教育科技售后服务
洛阳昕诺飞互联网科技有限公司
呼和浩特新华互联网科技学院
天津腾达互联网科技有限公司
互联网方面的科技前沿
每天都有哪些好的互联网科技
普陀区互联网教育科技管理办法
万物互联网智能科技
马化腾互联网科技教学
好易买互联网科技
绵阳真晨互联网科技有限公司
互联网科技名片
互联网科技战争
致骋互联网科技
互联网大会黑科技排名
佳云科技和互联网广告
哈尔滨屹滨互联网科技有限公司
美国互联网科技公司
科技互联网企业在行动
银川新华互联网科技学校招聘
小牛互联网科技有限公司地址