好友相关的功能至少包含
- 关注 / 取关
- 我(他)的关注
- 我(他)的粉丝
- 共同关注
- 我关注的人也关注他
这样的功能如果采用数据库,只是单纯得到用户的一些粉丝或者关注列表,也很简单、易实现,但若我想查出两个甚至多个用户共同关注人或想查询两个或者多个用户的共同粉丝,就会很麻烦,效率也不会很高。
但如果用 redis 去做的话就会相当的简单且高效。因为 redis 自己本身带有专门针对于这种集合的交集、并集、差集的一些操作。
总体思路我们采用 MySQL + Redis 的方式结合完成。
- MySQL 保存落地数据
- Redis 的 Sets 进行集合操作
数据表设计
CREATE TABLE `t_follow` ( `id` int(11) NOT NULL AUTO_INCREMENT , `diner_id` int(11) NULL DEFAULT NULL COMMENT '用户外键' , `follow_diner_id` int(11) NULL DEFAULT NULL COMMENT '用户食客外键' , `is_valid` tinyint(1) NULL DEFAULT NULL , `create_date` datetime NULL DEFAULT NULL , `update_date` datetime NULL DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=6 ROW_FORMAT=COMPACT;
创建代码模块 ms-follow
<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> <!-- swagger --> <dependency> <groupId>com.battcn</groupId> <artifactId>swagger-spring-boot-starter</artifactId> </dependency> </dependencies>
配置文件
server: port: 8084 # 端口 spring: application: name: ms-follow # 应用名 # 数据库 datasource: driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123456 url: jdbc:mysql://127.0.0.1:3306/db_redis?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false # Redis redis: port: 6379 host: 192.168.10.101 timeout: 3000 password: 123456 database: 2 # Swagger swagger: base-package: com.javaedge.follow title: 慕课美食社交食客API接口文档 # 配置 Eureka Server 注册中心 eureka: instance: prefer-ip-address: true instance-id: ${spring.cloud.client.ip-address}:${server.port} client: service-url: defaultZone: http://localhost:8080/eureka/ service: name: ms-oauth-server: http://ms-oauth2-server/ ms-diners-server: http://ms-diners/ mybatis: configuration: map-underscore-to-camel-case: true # 开启驼峰映射 logging: pattern: console: '%d{HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n'
实体类
@ApiModel(description = "食客关注实体类") @Getter @Setter public class Follow extends BaseModel { @ApiModelProperty("用户ID") private int dinerId; @ApiModelProperty("关注用户ID") private Integer followDinerId; }
业务流程
共同关注
Sets 拥有去重 (我们不能多次关注同一用户) 功能 。一个用户我们存贮两个集合:一个是保存用户关注的人 另一个是保存关注用户的人。
RedisKeyConstant
following(“following:”, “关注集合Key”),
followers(“followers:”, “粉丝集合Key”),