Redis实现朋友圈,微博等Feed流功能,实现Feed流微服务(业务场景、实现思路和环境搭建)

文章目录

    • 业务场景
    • Feed流相关概念
    • Feed流特征
    • Feed流分类
    • 实现思路
    • 环境搭建
      • 数据库表结构
      • 新建Feeds功能微服务ms-feeds
      • 配置类 RedisTemplateConfiguration
      • REST配置类 RestTemplateConfiguration
      • Feeds 实体类
      • FeedsVO 响应类

业务场景

在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈,微博,就是一种非常典型的Feed流产品,还有图片分享网站Pinterest,花瓣网等又是另一种形式的Feed流产品。除此之外,很多App的都会有一个模块,要么叫动态,要么叫消息广场,这些也是Feed流产品,可以说,Feed流产品是遍布天下所有的App中。
在这里插入图片描述

Feed流相关概念

我们在讲如何设计Feed流系统之前,先来看一下Feed流中的一些概念:

  • Feed:Feed流中的每一条状态或者消息都是Feed,比如朋友圈中的一个状态就是一个Feed,微博中的一条微博就是一个Feed。
  • Feed流:持续更新并呈现给用户内容的信息流。每个人的朋友圈,微博关注页等等都是一个Feed流。
  • Timeline:Timeline其实是一种Feed流的类型,微博,朋友圈都是Timeline类型的Feed流,但是由于Timeline类型出现最早,使用最广泛,最为人熟知,有时候也用Timeline来表示Feed流。
  • 关注页Timeline:展示其他人Feed消息的页面,比如朋友圈,微博的首页等。
  • 个人页Timeline:展示自己发送过的Feed消息的页面,比如微信中的相册,微博的个人页等。
  • 总结来说,Feed是将用户主动订阅的若干消息源组合在一起形成内容聚合器,帮助用户持续地获取最新的订阅源内容。Feed流即持续更新并呈现给用户内容的信息流。

Feed流特征

Feed流系统有一些非常典型的特点,比如:

  • 多账号内容流:Feed流系统中肯定会存在成千上万的账号,账号之间可以关注,取关,加好友和拉黑等操作。只要满足这一条,那么就可以当做Feed流系统来设计。
  • 非稳定的账号关系:由于存在关注,取关等操作,所以系统中的用户之间的关系就会一直在变化,是一种非稳定的状态。
  • 读写比例100:1:读写严重不平衡,读多写少,一般读写比例在10:1,甚至100:1以上。
  • 消息必达性要求高:比如发送了一条朋友圈后,结果部分朋友看到了,部分朋友没看到,这就很有问题,如果偏偏女朋友没看到,那么可能会产生很严重的感情矛盾,后果很严重。

Feed流分类

Feed流的分类有很多种,但最常见的分类有两种:

  • Timeline:按发布的时间顺序排序,先发布的先看到,后发布的排列在最顶端,类似于微信朋友圈,微博等。这也是一种最常见的形式。产品如果选择Timeline类型,那么就是认为Feed流中的Feed不多,但是每个Feed都很重要,都需要用户看到。
  • Rank:按某个非时间的因子排序,一般是按照用户的喜好度排序,用户最喜欢的排在最前面,次喜欢的排在后面。这种一般假定用户可能看到的Feed非常多,而用户花费在这里的时间有限,那么就为用户选择出用户最想看的Top N结果,场景的应用场景有图片分享、新闻推荐类、商品推荐等。

实现思路

解决Feed流最核心的两个问题:一个是存储,另一个是推送
① 存储
因为该项目中Feed比较简单,就类比于空间说说,因此可以使用MySQL关系型数据库存储,如果对于数据结构比较复杂的Feed流就要使用NoSQL数据库,这样存储更方便与高效,比如MongoDB或者HBase。
② 推送,在推送方案里面的,有三种方案,分别是:

  • 拉方案:也称为读扩散,用户主动去拉取关注人的Feed内容
  • 推方案:也成为写扩散,当用户添加Feed时,会自动将Feed通知给关注的人(优选)。使用Redis Sorted Sets(方便按时间排序Timeline)维护粉丝的Feed集合,当博主添加Feed时,主动将内容推送到粉丝的Feed集合中,这样用户可以很方便快速从集合中读取
  • 推拉结合:比如微博,大部分用户的账号关系都是几百个,但是有个别用户是1000万以上。

环境搭建

数据库表结构

CREATE TABLE `t_feeds` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`content` VARCHAR ( 500 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容',`fk_user_id` INT ( 11 ) NULL DEFAULT NULL,`praise_amount` INT ( 11 ) NULL DEFAULT NULL COMMENT '点赞数量',`comment_amount` INT ( 11 ) NULL DEFAULT NULL COMMENT '评论数量',`fk_restaurant_id` INT ( 11 ) NULL DEFAULT NULL  COMMENT '餐厅外键',`create_date` datetime NULL DEFAULT NULL,`update_date` datetime NULL DEFAULT NULL,`is_valid` TINYINT ( 1 ) NULL DEFAULT NULL,PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARACTER 
SET = utf8mb4 COLLATE = utf8mb4_general_ci AUTO_INCREMENT = 14 ROW_FORMAT = COMPACT;

新建Feeds功能微服务ms-feeds

pom依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>redis-seckill</artifactId><groupId>com.zjq</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ms-feeds</artifactId><dependencies><!-- eureka client --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- spring web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- spring data redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!-- commons 公共项目 --><dependency><groupId>com.zjq</groupId><artifactId>commons</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- swagger --><dependency><groupId>com.battcn</groupId><artifactId>swagger-spring-boot-starter</artifactId></dependency></dependencies></project>

SpringBoot配置文件:

server:port: 7005 # 端口spring:application:name: ms-feeds # 应用名# 数据库datasource:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rooturl: jdbc:mysql://127.0.0.1:3306/seckill?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false# Redisredis:port: 6379host: localhosttimeout: 3000password: 123456database: 2# Swaggerswagger:base-package: com.zjq.feedstitle: Feed功能微服务API接口文档# 配置 Eureka Server 注册中心
eureka:instance:prefer-ip-address: trueinstance-id: ${spring.cloud.client.ip-address}:${server.port}client:service-url:defaultZone: http://localhost:7000/eureka/service:name:ms-oauth-server: http://ms-oauth2-server/ms-users-server: http://ms-users/mybatis:configuration:map-underscore-to-camel-case: true # 开启驼峰映射logging:pattern:console: '%d{HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n'

启动类:

package com.zjq.feeds;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** Feeds功能微服务* @author zjq*/
@MapperScan("com.zjq.feeds.mapper")
@SpringBootApplication
public class FeedsApplication {public static void main(String[] args) {SpringApplication.run(FeedsApplication.class);}}

配置类 RedisTemplateConfiguration

/*** RedisTemplate配置类** @author zjq*/
@Configuration
public class RedisTemplateConfiguration {/*** redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类** @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 使用Jackson2JsonRedisSerialize 替换默认序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 设置key和value的序列化规则redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}}

REST配置类 RestTemplateConfiguration

/*** RestTemplate 配置类* @author zjq*/
@Configuration
public class RestTemplateConfiguration {@LoadBalanced@Beanpublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();converter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_PLAIN));restTemplate.getMessageConverters().add(converter);return restTemplate;}}

Feeds 实体类

/*** Feed信息类* @author zjq*/
@Getter
@Setter
@ApiModel(description = "Feed信息类")
public class Feeds extends BaseModel {@ApiModelProperty("内容")private String content;@ApiModelProperty("用户id")private Integer fkUserId;@ApiModelProperty("点赞")private int praiseAmount;@ApiModelProperty("评论")private int commentAmount;@ApiModelProperty("关联的餐厅")private Integer fkRestaurantId;}

FeedsVO 响应类

在这里插入图片描述

后续博文我会讲解如何实现添加 Feed 信息、删除 Feed 信息、关注/取关时处理用户相关Feed、分页获取关注的 Feed 数据等功能。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251874.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

html分享到微博,h5页面分享到微信、朋友圈、新浪微博、QQ空间、QQ好友组件

h5页面分享组件、支持分享到微信、朋友圈、新浪微博、QQ空间、QQ好友。 执行逻辑 - 微信客户端 手q qq浏览器 uc浏览器 其他浏览器 分享到微信 提示点击右上角分享 提示点击右上角分享 native分享 native分享 弹层提示 分享到朋友圈 提示点击右上角分享 提示点击右上角分享 nat…

微博2面:微信朋友圈是怎么实现的?

点击上方蓝字关注趣学程序&#xff01; 来源&#xff1a;r6d.cn/E8pb 差不多十年前&#xff0c;随着功能机的淘汰和智能机的普及&#xff0c;互联网开始进入移动互联网时代&#xff0c;最具代表性的产品就是微博、微信&#xff0c;以及后来的今日头条、快手等。这些移动化联网时…

微博朋友圈亿级Feed流如何轻松设计?

简介 Feed流是Feed 流&#xff0c;Feed的本意是饲料&#xff0c;Feed流的本意就是有人一直在往一个地方投递新鲜的饲料&#xff0c;如果需要饲料&#xff0c;只需要盯着投递点就可以了&#xff0c;这样就能源源不断获取到新鲜的饲料。 在信息学里面&#xff0c;Feed其实是一个…

h5端登录是什么意思_关于app、小程序和h5之间的区别

1.APP 运行环境——Android和IOS手机操作系统 系统权限—— 最多最全面&#xff0c;但有些属于隐私需要用户授权才能调用。&#xff08;安卓与IOS也有许多差异&#xff1a;Android类似于Windows&#xff0c;App几乎可读取本地所有文件&#xff1b;iOS端App无法读取本地除图片和…

python爬取微博非好友圈_Python爬虫之微博好友圈

数学建模已结束&#xff0c;刚开始的目标就是不熬夜&#xff0c;结果还是熬夜了(QAQ)&#xff0c;缓了一天就来写简书了&#xff0c;感觉很久没爬虫了&#xff0c;今天就爬下移动端的微博好友圈信息。 代码 import requests import json headers { Cookie:xxxxxxxx, User_Agen…

设计模式之~原型模式

定义&#xff1a;用原型实例指导创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象&#xff0c;而且不需知道任何创建的细节。 优点&#xff1a; 一般在初始化的信息不发生变化的情况下&#xff0c;克隆是最…

华安鑫创:创新举措推动新旧产业融合升级

华安鑫创控股&#xff08;北京&#xff09;股份有限公司&#xff08;以下简称“华安鑫创”、“公司”&#xff09;是一家汽车智能座舱电子综合服务商&#xff0c;主营业务为汽车中控和液晶仪表等座舱电子产品的核心显示器件定制选型、软件系统开发及配套器件的销售。华安鑫创自…

华安泰VIKOR“跨越者”解码服务器:深入系统全面应用

随着视频监控系统的高清化、智能化趋势&#xff0c;监控设备前端采集的数据量愈加庞大&#xff0c;这就必定需要一个强大的后端管理平台进行有效的储存和处理。VIKOR“跨越者”高清监控系统包涵了高清前端设备的同时&#xff0c;又有多种后端存储设备、管理平台、软硬件解码等设…

专精特新、高端领航 中交华安核心技术及产品介绍第1期:单侧型桥墩防护解决方案——SA级高强型低变形量护栏...

来源&#xff1a;中交华安 导读 1.大型车辆撞击桥墩可能引发重特大交通事故&#xff0c;造成严重事故后果和不良社会影响。 2.目前国内外鲜少有专门用于桥墩防护的安全设施&#xff0c;可用于路侧距离较近桥墩或中分带内薄壁墩的安全设施仍处于空白。 3.中交华安品牌SA级高强型…

凝聚安防正能量 华安泰坚定细分市场发展之路

中国安防行业经过三十多年的快速发展&#xff0c;目前已进入了转型期&#xff0c;这种转型既是自身发展使然&#xff0c;也有不得己的外因影响。今年&#xff0c;安防行业洗牌加速&#xff0c;更有传言四起&#xff0c;动摇军心。每一次重大的变革都必须经历一次痛苦的蜕变。中…

华安泰2014摄影作品征集:盛夏里的青春

2014年夏天&#xff0c;华安泰邀请您用镜头记录生活&#xff0c;以“盛夏里的生活”和“盛夏里的青春”为主题征集图片故事&#xff0c;优秀照片将在企业内刊《华安泰人》、公众微信“华安泰智能”和官网www.vikorcctv.com中展示。 征集主题&#xff1a; 1、盛夏里的生活 盛夏里…

mx250显卡天梯图_mx250显卡天梯图_2020年最新笔记本显卡天梯图,看看你的显卡排在哪!...

显卡天梯图就是显卡的性能排行榜&#xff0c;目前显卡主要有Nvidia(英伟达)和AMD(超微半导体)两大品牌。我们都知道&#xff0c;显卡性能决定了电脑的图像处理能力。对于喜欢玩游戏的电脑用户来说&#xff0c;处理器和显卡是用户最关心的电脑硬件&#xff0c;一块好的显卡对于游…

adreno性能天梯图_深度学习之GPU显卡性能天梯图

在深度学习的显卡市场&#xff0c;英伟达的地位还是暂时无人能够撼动的。专业卡暂不纳入考虑&#xff0c;毕竟性价比太低了。大家平时使用的还是老黄的游戏卡&#xff0c;性能排第一的就是Titan RTX了&#xff0c;具备24G大显存&#xff0c;然而售价也高达两万块。接下来就是大…

计算机显卡排名,显卡天梯图_显卡性能天梯图_2021笔记本显卡天梯图-中关村在线...

7612 影驰Geforce RTX 3090 HOF Extreme 限量版 排名 2领先 98.56%的对手 重要参数 核心频率:基础频率:1395MHz加速频率:1860MHz 显存类型:GDDR6X 流处理器:10496个 显存容量:24GB 详细参数 > 7466 七彩虹iGame GeForce RTX 3090 Neptune OC 排名 3领先 97.84%的对手 …

笔记本显卡天梯图2023 笔记本显卡性能天梯图2023年2月

2023最值得入手的笔记本选哪个版本好这些点很重要看过你就懂了http://www.adiannao.cn/dy 一、RTX 3080Ti笔记本显卡 1、将旗舰3080Ti显卡引入笔记本电脑&#xff0c;笔记本将搭载16GB GDDR6显存。 2、RTX 3080Ti笔记本电脑的起售价为2499美元。 3、满功耗的RTX 3080Ti可以达…

[转载]pAppLocale(微软AppLocale修改版,不会有乱码后遗症)+辅助配件

【转码】pAppLocale(微软AppLocale修改版&#xff0c;不会有乱码后遗症)辅助配件 这里仅就修改版及辅助配件进行介绍&#xff0c;对此软件没概念的烦请自行搜寻引擎查找&#xff01; pAppLocale(Microsoft AppLocale 修改版) ◎出处 http://www.csie.ntu.edu.tw/~piaip/ ◎下载…

转 Applocale:非Unicode程序界面乱码解决方法笔记

转 Applocale&#xff1a;非Unicode程序界面乱码解决方法笔记 2008年11月25日 星期二 下午 1:33 注&#xff1a; 为了不让 pAppLocale 消失 我也做了个下载备份 地址&#xff1a; http://www.brsbox.com/filebox/down/fc/1d30198f826cbb28eb110a0a8cfe5429 -------------------…

推荐工具:微软AppLocale

可以在不用更改“区域和语言选项”&#xff08;不需要重启系统&#xff09;的情况下&#xff0c;使应用程序读取非Unicode文件&#xff08;本文示例为日文EA文档&#xff09;&#xff0c;微软出品。 1.下载 & 安装&#xff1a;&#xff1a; http://www.microsoft.com/down…

Win7系统下如何成功安装 Microsoft Applocale (附安装软件技巧)

相信玩游戏的都知道 Microsoft Applocale&#xff0c;在这里不做介绍&#xff0c;我要讲的是如何正确并成功安装这个软件&#xff0c;可能是由于和win7系统不兼容的缘故吧&#xff0c;很多人都安装失败&#xff0c;安装的出现下面这个图。 我就直入主题吧&#xff0c;一次进行…

app locale Android 8,AppLocale2模块

App Locale 2模块是一款非常实用简单的切换设置语言的应用软件。这款软件里面被植入了世界上的大多数语言&#xff0c;可以让用户与各个国家的朋友进行交流与沟通&#xff0c;功能很强大&#xff0c;软件使用方法非常简单&#xff0c;如果有需要的朋友&#xff0c;就快来下载这…