本文部分翻译自Josiah L Carlson的《Redis in Action》,CHAPTER 8: Building a simple social network。
当用户登录到Twitter后,首先映入眼帘的即是一条由自己以及所关注的用户发布的状态消息所组成的时间轴。作为最基本的入口,其中的数据必须能够尽可能快的获取到。
这一部分,我们就来讨论如何存储时间轴数据并能快速的将其拿出来展示。
对于首页时间轴来说,所需的就是一个包含当前用户自己和关注者的状态消息列表。我们将其保存在ZSET中并以消息ID和时间戳分别作为成员和分数,如下图所示:
不过ZSET内仅仅记录了ID号,并不是状态消息本身,所以在程序处理的时候还需一个步骤就是去实际获得消息数据。下面的get_status_messages完成了该工作:
def get_status_messages(conn, uid, timeline='home:', page=1, count=30): statuses = conn.zrevrange( '%s%s'%(timeline, uid), (page-1)*count, page*count-1) pipeline = conn.pipeline(True) for id in statuses: pipeline.hgetall('status:%s'%id) return filter(None, pipeline.execute())
从代码中可以看出,函数首先从timeline中获取最新的消息列表,并以时间先后的倒序形式排列。
函数接收一个timeline参数,其默认为“home:”,即首页时间轴。除此之外,还有一个时间轴很常见,那就是用户主页,其中仅包含用户自己的状态消息。要获取该时间轴只需在timeline这个参数中传入“profile:”即可。