Redis实现微博后台业务逻辑系列(六)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

实现用户微博个人时间线和定制时间线:

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 ):
     """用户定制时间线和个人时间线"""
     def  __init__( self , client):
         self .client  =  client
         
     def  custom_push( self , user_id, msg_id, time):
         """将微博推入到用户定制的时间线中"""
         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):
         """将微博推入到用户的个人时间线中"""
         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):
         """将微博推入所有粉丝的定制时间线中"""
         for  fans  in  fans_ids:
             self .custom_push(fans, msg_id, time)
         
     def  custom_paging( self , user_id, n):
         """获取用户定制时间线第n页的微博"""
         count  =  5   # 5条数据为一页
         custom_timeline_key  =  "weibo::user::"  +  str (user_id)  +  "::custom_timeline"
         start_index  =  (n - 1 *  count   # 起始索引
         end_index  =  n * count  -  1   # 结束索引
         return  self .client.zrevrange(custom_timeline_key, start_index, end_index)
         
     def  personal_paging( self , user_id, n):
         """获取用户个人时间线第n页的微博"""
         count  =  5   # 5条数据为一页
         personal_timeline_key  =  "weibo::user::"  +  str (user_id)  +  "::personal_timeline"
         start_index  =  (n - 1 *  count   # 起始索引
         end_index  =  n * count  -  1   # 结束索引
         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 ( "没有粉丝" )
   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 ))

    什么是用户个人的微博时间线和定制的微博时间线呢?用户微博定制时间线包含了用户自己以及用户正在关注的人所发布的微博,我们用"weibo::user::<id>::custom_timeline"这个有序集合键保存;用户个人微博时间线,只包含用户自己发送的微博,我们用"weibo::user::<id>::personal_timeline"这个有序集合键保存。

        每条时间线都是一个有序集合,有序集合的元素是所发布微博的ID,分值为微博发布的时间。每当用户发送新的微博时,redis用zadd将新微博的时间和id添加到有序集合中。

        当然我们不能漏了广播操作,即每当用户发送一条新的微博时,redis不仅要将这条微博推入该用户的定制时间线和个人时间线,还需要将这条微博推入到该用户的所有粉丝的定制时间线中。

        在上面的代码中,我们使用了之前已经定义好的Message类来生成一条微博消息,再使用RelationShip类来实现向所有的粉丝的定制时间线推送微博信息。

本文转自戴柏阳的博客博客51CTO博客,原文链接http://blog.51cto.com/daibaiyang119/1963053如需转载请自行联系原作者


daibaiyang119

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8月前
|
NoSQL Java Redis
springboot搭建后台框架 (二)整合Redis
springboot搭建后台框架 (二)整合Redis
83 0
|
NoSQL Linux Redis
linux下后台启动redis
linux下后台启动redis
144 0
|
8月前
|
NoSQL Linux Redis
Linux系统中安装redis+redis后台启动+常见相关配置
Linux系统中安装redis+redis后台启动+常见相关配置
|
2月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
62 0
|
4月前
|
NoSQL Linux 测试技术
redis的安装步骤及前台,后台redis服务启动
这篇文章介绍了Redis的安装步骤,包括在Linux系统中下载、传输、解压、编译、安装Redis,以及Redis服务的前台和后台启动方法。
redis的安装步骤及前台,后台redis服务启动
|
6月前
|
存储 缓存 NoSQL
Redis性能优化问题之优化 Redis fork 耗时严重的问题,如何解决
Redis性能优化问题之优化 Redis fork 耗时严重的问题,如何解决
|
6月前
|
缓存 NoSQL Redis
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
Redis性能优化问题之当Redis内存达到maxmemory后,淘汰数据的逻辑是怎样的
|
8月前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
185 0
|
NoSQL Redis 数据库
Redis 常见面试问题 Redis持久化aof后台重写和写时复制
今天有个群里网友问,redis面试被问到aof 后台重写 写时复制,我尝试回答一下
461 17
|
缓存 NoSQL 中间件
太卷了!京东、微博最新「Redis缓存高手心法手册」竟被开源了
众所周知,分布式架构被广泛应用于企业级应用开发中,以满足高并发、高可用、高性能、高扩展性等要求。
下一篇
开通oss服务