Redis实现社交粉丝功能

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介: 好友相关的功能至少包含关注 / 取关我(他)的关注我(他)的粉丝共同关注我关注的人也关注他

好友相关的功能至少包含

  • 关注 / 取关
  • 我(他)的关注
  • 我(他)的粉丝
  • 共同关注
  • 我关注的人也关注他

这样的功能如果采用数据库,只是单纯得到用户的一些粉丝或者关注列表,也很简单、易实现,但若我想查出两个甚至多个用户共同关注人或想查询两个或者多个用户的共同粉丝,就会很麻烦,效率也不会很高。


但如果用 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;
}

业务流程

6.png

共同关注

Sets 拥有去重 (我们不能多次关注同一用户) 功能 。一个用户我们存贮两个集合:一个是保存用户关注的人 另一个是保存关注用户的人。

RedisKeyConstant

following(“following:”, “关注集合Key”),

followers(“followers:”, “粉丝集合Key”),

相关实践学习
基于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
目录
相关文章
|
1月前
|
存储 NoSQL PHP
如何用Redis高效实现点赞功能?用Set?还是Bitmap?
在众多软件应用中,点赞功能几乎成为标配。本文从实际需求出发,探讨如何利用 Redis 的 `Set` 和 `Bitmap` 数据结构设计高效点赞系统,分析其优缺点,并提供 PHP 实现示例。通过对比两种方案,帮助开发者选择最适合的存储方式。
28 3
|
2月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
32 2
|
2月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
25 2
|
2月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
70 2
|
4月前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
|
4月前
|
存储 缓存 监控
【Azure Redis 缓存】Azure Redis 功能性讨论二
【Azure Redis 缓存】Azure Redis 功能性讨论二
【Azure Redis 缓存】Azure Redis 功能性讨论二
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】Azure Redis功能性讨论
【Azure Redis 缓存】Azure Redis功能性讨论
|
4月前
|
NoSQL JavaScript Java
SpringBoot+Vue+Redis实现验证码功能、一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis
这篇文章介绍了如何使用SpringBoot结合Vue和Redis实现验证码功能,包括验证码的有效期控制和一小时内发送次数的限制。
|
4月前
|
存储 NoSQL Java
基于SpringBoot+Redis实现查找附近用户的功能
使用Redis的GEO命令结合SpringBoot实现查找附近用户的功能,通过`GEOADD`命令添加地理位置信息和`GEORADIUS`命令查询附近用户。
82 0