Reddit的Upvote功能简单实现

在Reddit和Stackoverflow或者知乎上都可以看见有一个Upvote功能,这种功能让用户去维护信息流动。它可以用Redis数据库实现。

构造数据库

我们用一个zset(由权重+值两部分组成)来存储每篇文章的post时间,zset是排序好的set,它是根据值对应的权重来排序的。这样就可以让文章以时间排序的方式排列显示。

127.0.0.1:6379> zadd time: 1430104804 article:100409
(integer) 1
127.0.0.1:6379> zadd time: 1332075503.49 article:100635
(integer) 1
127.0.0.1:6379> zadd time: 1332082035.26 article:100716
(integer) 1

用另外一个zset来存储每篇文章的排名加权权重,这样就可以让文章以排名权重的方式排列显示。

127.0.0.1:6379> zadd score: 1332225027.26 article:100716
(integer) 1
127.0.0.1:6379> zadd score: 1332075503.49 article:100635
(integer) 1
127.0.0.1:6379> zadd score: 1332065417.47 article:100408
(integer) 1

用一个元素不重复的set来存储对某篇文章投票过用户的id。假设已有三个用户对article:100408投过票。

127.0.0.1:6379> sadd voted:100408 user:234487
(integer) 1
127.0.0.1:6379> sadd voted:100408 user:253378
(integer) 1
127.0.0.1:6379> sadd voted:100408 user:364680
(integer) 1

实现

#! -*- /bin/user env python
# -*- coding: utf-8 -*-
import redis
import time

ONE_WEEK_IN_SECONDS = 7 * 86400
VOTE_SCORE = 432 # 自定义投票后增加的排序权重
conn = redis.StrictRedis(host=‘localhost‘, port=6379, db=0)

def article_vote(conn, user, article):
    cutoff = time.time() - ONE_WEEK_IN_SECONDS
    # 只能只对最近一个星期内的文章进行投票
    if conn.zscore(‘time:‘, article) < cutoff:
        return

    article_id = article.partition(‘:‘)[-1]
    # 在voted:article_id set中添加对这篇文章 upvote的用户,防止重复upvote
    if conn.sadd(‘voted:‘ + article_id, user):
        # 对这篇文章增加排序权重
        conn.zincrby(‘score:‘, article, VOTE_SCORE)
        # 维持一个hashtable对文章的upvote计数
        conn.hincrby(article, ‘votes‘, 1)

if __name__ == ‘__main__‘:
    article_vote(conn, ‘user:1‘, ‘article:100408‘)
    article_vote(conn, ‘user:2‘, ‘article:100408‘)
    article_vote(conn, ‘user:3‘, ‘article:100408‘)

Upvote结果

查看set中voted:100408是哪些用户投票的

SMEMBERS voted:100408

127.0.0.1:6379> SMEMBERS voted:100408
1) "user:1"
2) "user:5"
3) "user:4"
4) "user:234487"
5) "user:2"
6) "user:3"
7) "user:253378"
8) "user:364680"

查看哈希表article:100408中项votes的计数,即投票数,可以得到投票数为8。

HGET article:100408 votes

Reference

[1].Redis in Action. Page16~18

[2].http://redis.io/commands/zscore

时间: 2024-11-25 15:44:15

Reddit的Upvote功能简单实现的相关文章

安装Visual Studio 2013 update 2 更新包记录和新功能简单体验

昨天下载了进4个小时,将visual studio 2013 update 2 更新包和visual studio 2013 完整安装包(包含UPDATE2)的下载完成,今天抽出时间体验一下,昨天在网上看了一下英文翻译的说明,增加了一些支持和改进,我只是针对于我所看到的来操作使用一下,看看有啥变化吧.将ISO文件加载到虚拟光驱,然后开始安装更新包,界面弹出后告诉我需要大概3个多G的硬盘空间,嗨真是大啊.点击安装开始继续安装,我截个图如下 剩下是就是等着安装完成了,整个安装过程还是比较慢的,安装的

HTML-003-模拟IDE代码展开收起功能简单示例

当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作. 同时,我们在日常的网页,尤其的广大的博客网站的源码展示部分,都采用了此种显示方式,如下图所示(示例引用位置:008-Selenium 操作下拉列表实例-Select): 这么做的意义何在呢?我觉得其实际应用有如下两种: 内容的展示和隐藏:将用户最关心.感兴趣的内容展示给用户,若用户想继续深入了解,则可通过点击展示或隐藏按钮达到查看.隐藏内容

用Egret制作功能简单的打地鼠类游戏《冰桶挑战》

今天教大家使用Egret制作一款功能简单的游戏--<冰桶挑战>,这是一款大家熟悉的打地鼠类游戏,点击屏幕使用冰桶浇灭地洞里钻出来的明星,结算得到分数.游戏页面布局使用EUI封装了大量的常用UI组件,满足大部分的交互界面需求,开发者仅用1天时间即可独立完成这款小游戏的开发. 游戏效果图如下: 游戏比较简单,分为以下几个场景: · 开始场景 · 游戏场景 · 结束场景 · 游戏类 开始场景 这里使用Eui来搭建UI,舞台大小选择640 x 960,填充模式选择fixedWidth: 新建Eui组件

Jenkins File fingerprinting功能简单使用

在Jenkins官网再次查阅Jenkins功能介绍资料时, 看到有10个功能,而这10个功能最陌生的是File fingerprinting的功能. 已经使用Jenkins好久了,之前也曾得知有这个功能,但从未实践过该功能,很好奇,于是试用并记录. File fingerprinting详细介绍如下: File fingerprinting : Jenkins can keep track of which build produced which jars, and which build i

js实现类似jquery基础功能 简单选择器/事件/属性

按钮样式定义 <style> .btn{display: inline-block;width: 100px;height: 20px;color: #fff;font-size: 12px;background-color: #0033dd;text-align: center;line-height: 20px;text-decoration: none;border:  5px #0000ff outset;} .btn-big-test{width: 300px;height: 85p

Yii2高速构建RESTful Web服务功能简单介绍

Yii2相比Yii1而言,一个重大的改进是内置了功能完备的RESTful支持. 其内置RESTful支持提供了例如以下功能: 使用ActiveRecord的通用接口来高速构建原型: 应答格式协商(缺省支持 JSON 和 XML). 可定制的对象序列化,支持选择输出哪些列. 请求数据的格式化以及验证错误: 通过HTTP 动词映射实现高效路由: 支持 OPTIONS 和 HEAD 动词: 认证 和 鉴权: 支持 HATEOAS(RESTful的架构约束,超媒体即应用程序状态): 结果缓存.可使用 y

Curve Mode在Zbrush中功能简单介绍

Curve Mode是ZBrush中比较重要的一个工具,它的主要功能有两个,本文小编将给大家简单介绍Curve Mode的功能以及它的笔刷有哪些. Curve Mode主要有两大功能:修改模型的表面和添加模型. Curve Mode只是一个笔刷调板,展开Stroke面板就可以看到Curve Mode.它必须依附在模型上,所以在使用Curve Mode前要先建立一个多边形模型才可. 展开笔刷调板,下面这14个笔刷都是开启了Curve Mode的笔刷,他们的前缀都包含了Curve这个单词.这些是官方

Maxscale 功能简单介绍

MaxScale使用基于数据库语句规则检测再转发到后端群集内的服务器,透明地为应用程序提供负载均衡和高可用性功能,具有可扩展和灵活的架构. MaxScale中的限制参考官方文档: https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-22-limitations-and-known-issues-within-mariadb-maxscale/ 配置分为几大模块: 全局配置[maxscale] 主要配置服务的基本参数,比如启动

apache功能简单了解

实现http协议的程序有很多,比较有名的有:IIS目前市面上使用最多的,nginx使用的人数正在快速正加,apache古老的.apache虽然正在被-但是我们也要学习一下,它的市场份额还是有一些的,而且它的实现方式更加经典. 以上只是在http协议上实现静态数据传输,还有动态数据部分,动态数据就是可以变化的数据,这个变化就是根据浏览者的不同网页显示不同的数据.动态网页的实现语言有:php实现它的服务也叫php:asp.net实现它的是IIS,IIS不仅是静态服务器也是动态服务器:javascri