Hello Redis - Voting on articles

Redis in Action JOSIAH L. CARLSON MANNING Shelter Island

 1 ONE_WEEK_IN_SECONDS = 7 * 86400
 2 VOTE_SCORE = 432
 3
 4 def article_vote(conn, user, article):
 5     cutoff = time.time() - ONE_WEEK_IN_SECONDS
 6     if conn.zscore(‘time:‘, article) < cutoff:
 7         return
 8
 9     article_id = article.partition(‘:‘)[-1]
10     if conn.sadd(‘voted:‘ + article_id, user):
11         conn.zincrby(‘score:‘, article, VOTE_SCORE)
12         conn.hincrby(article, ‘votes‘, 1)
13
14 def post_article(conn, user, title, link):
15     article_id = str(conn.incr(‘article:‘))
16
17     voted = ‘voted:‘ + article_id
18     conn.sadd(voted, user)
19     conn.expire(voted, ONE_WEEK_IN_SECONDS)
20
21     now = time.time()
22     article = ‘article:‘ + article_id
23     conn.hmset(article, {
24             ‘title‘: title,
25             ‘link‘: link,
26             ‘poster‘: user,
27             ‘timer‘: now,
28             ‘votes‘:1,
29         })
30
31     conn.zadd(‘score:‘, article, now + VOTE_SCORE)
32     conn.zadd(‘time:‘, article, now)
33
34     return article_id
35
36
37 ARTICLES_PER_PAGE = 25
38
39 def get_articles(conn, page, order=‘score:‘):
40     start = (page-1) * ARTICLES_PER_PAGE
41     end = start + ARTICLES_PER_PAGE - 1
42
43     ids = conn.zrevrange(order, start, end)
44     articles = []
45     for id in ids:
46         article_data = conn.hgetall(id)
47         article_data[‘id‘] = id
48         articles.append(article_data)
49
50     return articles
 1 def add_remove_groups(conn, article_id, to_add=[], to_remove=[]):
 2     article = ‘article:‘ + article_id
 3     for group in to_add:
 4         conn.sadd(‘group:‘ + group, article)
 5     for group in to_remove:
 6         conn.srem(‘group:‘ + group, article)
 7
 8 def get_group_articles(conn, group, page, order=‘score:‘):
 9     key = order + group
10     if not conn.exists(key):
11         conn.zinterstore(key,
12             [‘group:‘ + group, order],
13             aggregate = ‘max‘,
14         )
15         conn.expire(key, 60)
16     return get_articles(conn, page, key)
时间: 2024-11-15 05:33:12

Hello Redis - Voting on articles的相关文章

通过限时写代码,优化代码的方式。 1.containerView

http://baozoumanhua.com/users/11655690/articleshttp://baozoumanhua.com/users/11655696/articleshttp://baozoumanhua.com/users/11655697/articleshttp://baozoumanhua.com/users/11655702/articleshttp://baozoumanhua.com/users/11655949/articleshttp://baozouma

rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较

Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能. 针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/1190000003985468,下面介绍一下Kafka的架构和涉及到的名词: Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Parti

Redis数据存储解决方案

1.背景1.1 Redis简介 官方网站:http://redis.io/,Redis是REmote DIctionary Server的缩写. Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主持.它跟 memcached 类似,不过数据可以持久化,而且支持的数据类型很丰富.它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点.从而

redis总结(一) -- php中redis的使用

经常用到redis,但基本上都是基于集成开发环境,redis的连接也是基于框架自身,总感觉缺点什么,恰好在ubuntu系统中apt-get并不直接提供php的redis扩展,借此机会总结了下redis对php的支持 如果想想要在程序中使用redis,那么要有两个先决条件,第一要安装redis程序,第二要使redis支持php 这里主要谈一下redis对php的支持,我们常见的有两种 1.phpredis(实现方式:php扩展,c语言) 特点:需要我们在开发环境中安装php扩展,使用比较方便,缺点

Spark Streaming写数据到Redis

参考2篇文章: 1.Kafka+Spark Streaming+Redis实时系统实践 https://www.iteblog.com/archives/1378 2.spark-stream 访问 Redis http://www.tuicool.com/articles/n6BRzi3

Redis的缓存策略和主键失效机制

作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略. 在Redis当中,有生存期的key被称为volatile.在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除. 1.影响生存时间的一些操作 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆盖原来的数据,也就是说,修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间不同. 比如说,对一个 key 执行I

asp.net core 使用 Redis 和 Protobuf

asp.net core 使用 Redis 和 Protobuf 前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资源缓存和Session缓存. 如果你觉得对你有帮助的话,不妨点个[推荐]. 目录 Redis 介绍 asp.net core Session 介绍 Redis & Session 实例讲解 Session的使用 使用 Protobuf

全面剖析Redis Cluster原理和应用 (转)

1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cluster推出之前,可用性要靠Sentinel

python第六十一天,第六十二天 redis

redis 缓存系统 redis是业界主流的key-value nosql 数据库之一.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内