Redis实现微博后台业务逻辑系列(六)
實(shí)現(xiàn)用戶微博的個(gè)人時(shí)間線和定制時(shí)間線:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | imprort?redis class?TimeLine(object): ????"""用戶定制時(shí)間線和個(gè)人時(shí)間線""" ????def?__init__(self,?client): ????????self.client?=?client ????????? ????def?custom_push(self,?user_id,?msg_id,?time): ????????"""將微博推入到用戶定制的時(shí)間線中""" ????????custom_timeline_key?=?"weibo::user::"?+?str(user_id)?+?"::custom_timeline" ????????self.client.zadd(custom_timeline_key,?time,?msg_id) ????????? ????def?personal_push(self,?user_id,?msg_id,?time): ????????"""將微博推入到用戶的個(gè)人時(shí)間線中""" ????????personal_timeline_key?=?"weibo::user::"?+?str(user_id)?+?"::personal_timeline" ????????self.client.zadd(personal_timeline_key,?time,?msg_id) ????????? ????def?broadcast(msg_id,?time,?*fans_ids): ????????"""將微博推入所有粉絲的定制時(shí)間線中""" ????????for?fans?in?fans_ids: ????????????self.custom_push(fans,?msg_id,?time) ????????? ????def?custom_paging(self,?user_id,?n): ????????"""獲取用戶定制時(shí)間線第n頁(yè)的微博""" ????????count?=?5??#?5條數(shù)據(jù)為一頁(yè) ????????custom_timeline_key?=?"weibo::user::"?+?str(user_id)?+?"::custom_timeline" ????????start_index?=?(n-1)?*?count??#?起始索引 ????????end_index?=?n*count?-?1??#?結(jié)束索引 ????????return?self.client.zrevrange(custom_timeline_key,?start_index,?end_index) ????????? ????def?personal_paging(self,?user_id,?n): ????????"""獲取用戶個(gè)人時(shí)間線第n頁(yè)的微博""" ????????count?=?5??#?5條數(shù)據(jù)為一頁(yè) ????????personal_timeline_key?=?"weibo::user::"?+?str(user_id)?+?"::personal_timeline" ????????start_index?=?(n-1)?*?count??#?起始索引 ????????end_index?=?n*count?-?1??#?結(jié)束索引 ????????return?self.client.zrevrange(personal_timeline_key,?start_index,?end_index) if?__name__?==?"__main__": ??redis_client?=?redis.StrictRedis()???????? ??msg?=?Message(redis_client) ??message_id,?weibo_timestamp?=?msg.create(10086,?"hello?world") ??#?print("message_id:",?message_id) ??#?print("weibo_timestamp:",?weibo_timestamp) ??tl?=?TimeLine(redis_client) ??tl.custom_push(10086,?message_id,?weibo_timestamp) ??tl.personal_push(10086,?message_id,?weibo_timestamp) ??relation?=?RelatoinShip(redis_client) ??fans_dict?=?relation.get_all_fans(10086) ??if?fans_dict?==?False: ??????print("沒(méi)有粉絲") ??else: ??????fans_list?=?list() ??????for?fans?in?fans_dict: ??????????fans_list.append(fans.decode()) ??????tl.broadcast(message_id,?weibo_timestamp,?*fans_list) ????????? ??print(tl.custom_paging(10086,?1)) ??print(tl.personal_paging(10086,?1)) |
????什么是用戶個(gè)人的微博時(shí)間線和定制的微博時(shí)間線呢?用戶微博定制時(shí)間線包含了用戶自己以及用戶正在關(guān)注的人所發(fā)布的微博,我們用"weibo::user::<id>::custom_timeline"這個(gè)有序集合鍵保存;用戶個(gè)人微博時(shí)間線,只包含用戶自己發(fā)送的微博,我們用"weibo::user::<id>::personal_timeline"這個(gè)有序集合鍵保存。
????????每條時(shí)間線都是一個(gè)有序集合,有序集合的元素是所發(fā)布微博的ID,分值為微博發(fā)布的時(shí)間。每當(dāng)用戶發(fā)送新的微博時(shí),redis用zadd將新微博的時(shí)間和id添加到有序集合中。
????????當(dāng)然我們不能漏了廣播操作,即每當(dāng)用戶發(fā)送一條新的微博時(shí),redis不僅要將這條微博推入該用戶的定制時(shí)間線和個(gè)人時(shí)間線,還需要將這條微博推入到該用戶的所有粉絲的定制時(shí)間線中。
????????在上面的代碼中,我們使用了之前已經(jīng)定義好的Message類來(lái)生成一條微博消息,再使用RelationShip類來(lái)實(shí)現(xiàn)向所有的粉絲的定制時(shí)間線推送微博信息。
本文轉(zhuǎn)自戴柏陽(yáng)的博客博客51CTO博客,原文鏈接http://blog.51cto.com/daibaiyang119/1963053如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
daibaiyang119
總結(jié)
以上是生活随笔為你收集整理的Redis实现微博后台业务逻辑系列(六)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一周总结(十六)
- 下一篇: “中国智造”为System x提供创新源