Redis实现简单文章投票

2023-11-12

鉴于Redis被鹅厂一面二面问过的原因

还是要好好学习一下

《Redis实战》第一章的例子

实现的功能

1)给文章投票

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]
	
	if conn.sadd('voted:'+article_id,user):
		conn.zincrby('score:',article,VOTE_SCORE)
		conn.hincrby(article,'votes',1)

2)发布一个文章

def post_article(conn,user,title,link):
	article_id=str(conn.incr('article:'))
	voted='voted:'+article_id
	conn.sadd(voted,user)
	conn.expire(voted,ONE_WEEK_IN_SECONDS)
	now=time.time()
	article='article:'+article_id
	conn.hmset(article,{'title':title,'link':link,'poster':user,'time':now,'votes':1})
	conn.zadd('score:',article,now+VOTE_SCORE)
	conn.zadd('time:',article,now)
	return article_id

3)获取文章列表


ARTICLES_PER_PAGE = 25
def get_articles(conn,page,order='score:'):
	start=(page-1)*ARTICLES_PER_PAGE
	end=start+ARTICLES_PER_PAGE-1
	ids=conn.zrevrange(order,start,end)
	articles=[]
	for id in ids:
		article_data=conn.hgetall(id)
		article_data['id']=id
		articles.append(article_data)
	return articles

4)文章更改分组

def add_remove_groups(conn,article_id,to_add=[],to_remove=[]):
	article='article:'+article_id
	for group in to_add:
		conn.sadd('group:'+group,article)
	for group in to_remove:
		conn.srem('group:'+group,article)

5)获取某分组文章

def get_group_articles(conn,group,page,order='score:'):
	key=order+group
	if not conn.exists(key):
		conn.zinterstore(key,['group:'+group,order],aggregate='max',)
		conn.expire(key,60)
	return get_articles(conn,page,key)

 

测试代码

class TestCh01(unittest.TestCase):
    def setUp(self):
        import redis
        self.conn = redis.Redis(db=15)

    def tearDown(self):
        del self.conn
        print
        print

    def test_article_functionality(self):
        conn = self.conn
        import pprint

        article_id = str(post_article(conn, 'username', 'A title', 'http://www.google.com'))
        print "We posted a new article with id:", article_id
        print
        self.assertTrue(article_id)

        print "Its HASH looks like:"
        r = conn.hgetall('article:' + article_id)
        print r
        print
        self.assertTrue(r)

        article_vote(conn, 'other_user', 'article:' + article_id)
        print "We voted for the article, it now has votes:",
        v = int(conn.hget('article:' + article_id, 'votes'))
        print v
        print
        self.assertTrue(v > 1)

        print "The currently highest-scoring articles are:"
        articles = get_articles(conn, 1)
        pprint.pprint(articles)
        print

        self.assertTrue(len(articles) >= 1)

        add_remove_groups(conn, article_id, ['new-group'])
        print "We added the article to a new group, other articles include:"
        articles = get_group_articles(conn, 'new-group', 1)
        pprint.pprint(articles)
        print
        self.assertTrue(len(articles) >= 1)

        to_del = (
            conn.keys('time:*') + conn.keys('voted:*') + conn.keys('score:*') + 
            conn.keys('article:*') + conn.keys('group:*')
        )
        if to_del:
            conn.delete(*to_del)

if __name__ == '__main__':
    unittest.main()

可以看出

Python连接Redis 和PHP连接MySQL差不多啊,都是要用conn那个连接,然后执行Redis语句即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis实现简单文章投票 的相关文章

随机推荐

  • 2019-2013全球开放数据价值贡献优秀案例

    报告通过梳理和分析全球开放数据价值贡献优秀案例 探索开放数据价值创造的模式 路径和机制 为我国利用开放数据促进经济发展 提升国家治理水平和公共服务能力提供经验参考 关注公众号 互联互通社区 回复 DATA171 获取全部报告内容 精彩推荐
  • can connect mysql not server_解决UCenter info: Can not connect to MySQL server的方法

    今天把网站换了台服务器结果发现UCenter打开时提示UCenter info Can not connect to MySQL server 了 但通信是没有问题 只是注册时提示错误 这个不用说就是数据库配置文章的问题 修改下Discuz
  • MPU6050 获取角度理论推导(一)

    当你搜到这篇文章的时候说明你已经在做陀螺仪的项目了 那么陀螺仪具体的东西应该不用多说 他其实就是一个获取原始数据然后通过DMP或者MCU的计算处理 然后得到角度的一个传感器 MPU6050内部集成了一个陀螺仪一个加速传感器还有DMP计算单元
  • C# 实现对XML的基本操作(创建xml文件,增、删、改、查 xml节点信息)

    XML文件在存储 交换和传输数据信息上有着很方便处理 那么今天这篇文章主要讲一下用C 如何实现对XML文件的基本操作 如 创建xml文件 增 删 改 查xml的节点信息 所使用的方法很基础 方便易懂 本文的主要模块为 生成xml文件 遍历x
  • 金三银四到了,如何准备初、高级测试工程师技术面试?

    你眼中的软件测试岗位是怎样的 大部分人可能会给出这样的回答 测试 简单啊 没什么技术含量 无非就是看需求 看业务手册 看设计文档 然后点点功能是否实现 麻烦点的就是测试下部署安装是否出现兼容性问题等 没错 不可否认这是踏入软件测试行业的基本
  • 高级运维开发工程师带你处理linux木马(挖矿病毒)实战例子

    一 事态描述 centos7测试服务器 突然密码登不上去了 然后CPU占100 已经猜到 登录密码过于简单 密码被破解挂马了 大概率是CPU挖矿病毒 二 重置centos7登录root密码 步骤1 启动Linux Centos7系统 当出现
  • 解决ubuntu安装whl速度过慢的加速方法

    ubuntu安装whl或其他工具时速度过慢 在已经设置好conda和系统都为国内源的前提下还特别慢 速度只有几kb 不知道为什么 解决方法 自己手动安装 比如我要装matplotlib pip install i https pypi tu
  • 安卓移动应用开发之从零开始写安卓小程序

    实验一 安装我们的开发环境 一 开发工具 我们开发用的是谷歌出品的Android Studio 它集成了IEDA了功能 学习过后端开发的小伙伴肯定都熟悉IDEA 当然VsCode也是不错的选择 这里我放一个Android Studio的下载
  • Vue中的条件渲染

    条件渲染 1 v if 写法 1 v if 表达式 2 v else if 表达式 3 v else 表达式 适用于 切换频率较低的场景 特点 不展示的DOM元素直接被移除 注意 v if可以和v else if v else一起使用 但要
  • 使用姿势估计进行跌倒检测

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 所有目标检测已成为动作识别研究的重要垫脚石 即训练AI对行走和坐下等一般动作进行分类 为了使AI能够理解接收到的输入 我们需要教它检测特定的图案和形状 并制定自己的规则
  • 基于STM32的简易电压、频率、占空比测量仪

    基于STM32的简易电压 频率 占空比测量仪 任务描述 一 硬件设计 1 整形电路 2 15V 报警电路 3 stm32 最小系统周围电路 二 软件部分 原理 STM32cubeMX配置 主要代码 三 实验结果展示 任务描述 任务详解 我们
  • Javascript Common Tools Class

    Javascript Common Tools Class Email Daniel Chow Tech Hotmail ComBlog http www cnblogs com DanielChow 2010 2 20 update va
  • Hadoop 2.x 生态系统及技术架构图

    一 负责收集数据的工具 Sqoop 关系型数据导入Hadoop Flume 日志数据导入Hadoop 支持数据源广泛 Kafka 支持数据源有限 但吞吐大 二 负责存储数据的工具 HBase MongoDB Cassandra Accumu
  • 最全的登录功能测试点

    1 基本功能测试点 输入正确的用户名和密码登录成功 输入错误的用户名密码登录失败 用户名正确 密码错误 是否提示输入密码错误 用户名错误 密码正常 是否提示输入用户名错误 用户名和密码都错误 是否有相应提示 用户名密码为空时 是否有相应提示
  • Hive元数据存储和表数据存储

    一 相关概念 1 元数据 metadata 元数据 Meta Date 主要记录数据仓库中模型的定义 各层级间的映射关系 监控数据仓库的数据状态及 ETL 的任务运行状态 一般会通过元数据资料库 Metadata Repository 来统
  • 调试SAR SENSOR的一些感悟

    手机工作时是有电磁辐射的https zhuanlan zhihu com p 353591714 那怎样能降低电磁辐射对人体的伤害呢 sar sensor能感应到有人在使用手机 从而发消息让modem降低发射功率 从而达到标准 如果没人在使
  • Ubuntu 18 安装 cmake

    1 官网下载合适的版本 https cmake org download or cmake 3 19 4 tar gz https download csdn net download liyunlong19870123 15009838
  • 【转】转换思维,寻找创新点

    一种重要的科研思维 它就是发散思维 在科研的过程中 会用发散思维是特别特别重要的 很多时候在找课题的创新点 或者打算写小论文时 都需要好的想法来支撑 这就非常需要用发散思维去找好的想法和创新点啦 同样一件事情 同样一个问题 为什么他的角度这
  • K8S Pod配置详解(spec)

    Pod 是 Kubernetes 中最基本的资源对象之一 代表一组容器的单位 以下是几个重要的 Pod 字段的含义和用法 metadata 包含了 Pod 的元数据 例如名称 标签 命名空间等 spec 定义了 Pod 的行为和构建 例如容
  • Redis实现简单文章投票

    鉴于Redis被鹅厂一面二面问过的原因 还是要好好学习一下 Redis实战 第一章的例子 实现的功能 1 给文章投票 def article vote conn user article cutoff time time ONE WEEK