利用Redis实现自己的微博引擎

 

Redis这个名字是由RemoteDictionaryServer中的前几个字母拼凑而成,它和Memcached一样也是一个key-value存储系统。...



1.Redis介绍

Redis这个名字是由RemoteDictionary Server中的前几个字母拼凑而成,它和Memcached一样也是一个key-value存储系统。但和Memcached不一样的是,它提供的存储数据结构要比Memcached丰富和强大得多,它不仅提供了最简单的string结构,还提供了 lists,sets, ordered sets 以及 hashes等一系列数据结构,同时提供了在这些数据结构上的一系列方便的操作。

Redis不仅提供丰富的数据结构还具有极高的性能,支持超过 100K+ 每秒的读写频率(这个数据待验证)。Redis所有的操作都是原子性的,同时还支持在后台将几个操作合并成一个原子操作。Redis还有一个特点是支持内存数据的持久化,支持数据文件形式的持久化和追加日志形式(Append-OnlyFile)的持久化。因为Redis强大的功能和出色的性能,目前许多大型机构开始使用它,新浪微博对其就有大量应用。

Redis主要提供5种数据类型(数据结构):

String:String类型的数据和Memcached是一样,是一种最基本的类型。

List:链表类型,key对应的是一个链表,这个链表不是指业务系统提供的Value值是一个链表,而是Redis本身存储的结构就是一个链表,你可以在上面进行push、pop等操作,可以将key理解为链表的名字。比如“LPUSH users ‘jack’”是将jack这个用户加入到users这个key对应的链表中,“LRANGE users 0 100”是获取users链表的前100个元素。

Set:顾名思义,Set就是集合,可以在集合上添加删除元素,key就是集合的名字。将一个元素加入集合可以调用SADD操作。

Hash:Redis能够存储key对应多个属性的数据,即value值本身也是一个hash结构,比如key的名字是user,存储的是用户信息,那么user上还可以有user.name属性和user.password属性分别对应姓名和密码。2.社会关系引擎的实现

当前很多互联网应用都加入了社会关系的元素,这种应用以微博为代表,微博引擎的核心的实现是用户之间关注与被关注的关系,而且这种关系又是一种开放的弱连接关系,即像twitter一样,你既有自己的Following也有自己的Followers,而这两者是不必相同的。



以下是在Redis中存储实现用户数据结构的核心代码(代码采用Python语言实现,已进行了精简)。为了在Redis中存储用户所关注的其他用户,可以利用Redis的Set数据类型,定义形如"ruser:id::%s:followees"的key,其中的占位符是用户的id,其值是一个集合,每关注一个用户,就将被关注用户的id加入到该集合中,在关注一个用户的同时,还会将本用户的id加入到被关注用户的follower集合中,即下图中follow函数所实现的功能。用户的followers也是集合,集合的key形如"ruser:id:%s:followers",其中的占位符即用户的id,集合的元素是用户关注者的id。



除了实现用户之间的关注关系外,还可以实现Post(发微博)功能。上图中的add_post和add_timeline_post两个函数就是实现Post功能的核心函数。使用过微博的人都知道用户的微博页面分为两种视图,用户个人页面和timeline页面。个人页面上展示的是自己所发的全部微博,而timeline页面除了自己所发微博之外还包括自己所关注用户所发微博。用户的所有Posts用List结构来存储,使用列表可以保证Post按照其发布的顺序来存储。列表的元素是Post的id,列表的key形如"ruser:id:%s:posts",其中的占位符为用户的id。用户的timeline也以列表数据结构来存储,这样所有post可以按其发布时间来展现从而实现timeline。列表的key为"ruser:id:%s:timeline",占位符用用户id来填充,列表元素为Post的id。用户发微博时会调用add_post,将Post的id加入到列表"ruser:id:%s:posts"中,同时将Post的id加入到用户的timeline中。除了将Post加入到自己的timeline之外,还会将Post加入到该用户所有关注者的timeline中,这也是提供add_timeline_post函数的目的。下图是Post数据结构的实现(已进行代码精简,其中有部分代码是为了实现网址缩短和@功能):



上面的例子比较简单,为了实现一个可用的微博引擎,实际的代码要复杂得多,这里只是阐述实现一个微博引擎的一些基本设计思想,希望能提供一些借鉴意义,引起更多思考。


    关注 全栈人生


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册