java增加缓存模块_评论模块优化 - 数据表优化、添加缓存及用 Feign 与用户服务通信...

针对评论模块的优化,将评论与回复合为一张表并移除用户头像字段,通过Feign与用户服务交互获取头像。为解决大量评论时的性能问题,采用Redis缓存评论数据,当有新评论时删除缓存,确保数据新鲜。此外,介绍了如何根据资源ID查询评论并进行层级排序。
摘要由CSDN通过智能技术生成

前段时间设计了系统的评论模块,并写了篇文章 评论模块 - 后端数据库设计及功能实现 讲解。

大佬们在评论区提出了些优化建议,总结一下:

之前评论一共分了两张表,一个评论主表,一个回复表。这两张表的字段区别不大,在主表上加个 pid 字段就可以不用回复表合成一张表了。

评论表中存了用户头像,会引发一些问题。比如用户换头像时要把评论也一起更新不太合适,还可能出现两条评论头像不一致的情况。

的确数据库设计的有问题,感谢 wangbjun 和 JWang。

下面就对评论模块进行优化改造,首先更改表结构,合成一张表。评论表不存用户头像的话,需要从用户服务获取。用户服务提供获取头像的接口,两个服务间通过 Feign 通信。

这样有个问题,如果一个资源的评论比较多,每个评论都调用用户服务查询头像还是有点慢,所以对评论查询加个 Redis 缓存。要是有新的评论,就把这个资源缓存的评论删除,下次请求时重新读数据库并将最新的数据缓存到 Redis 中。

代码出自开源项目 coderiver,致力于打造全平台型全栈精品开源项目。

项目地址:https://github.com/cachecats/...

本文将分四部分介绍

数据库改造

用户服务提供获取头像接口

评论服务用 Feign 访问用户服务取头像

使用 Redis 缓存数据

一、数据库改造

数据库表重新设计如下

CREATE TABLE `comments_info` (

`id` varchar(32) NOT NULL COMMENT '评论主键id',

`pid` varchar(32) DEFAULT '' COMMENT '父评论id',

`owner_id` varchar(32) NOT NULL COMMENT '被评论的资源id,可以是人、项目、资源',

`type` tinyint(1) NOT NULL COMMENT '评论类型:对人评论,对项目评论,对资源评论',

`from_id` varchar(32) NOT NULL COMMENT '评论者id',

`from_name` varchar(32) NOT NULL COMMENT '评论者名字',

`to_id` varchar(32) DEFAULT '' COMMENT '被评论者id',

`to_name` varchar(32) DEFAULT '' COMMENT '被评论者名字',

`like_num` int(11) DEFAULT '0' COMMENT '点赞的数量',

`content` varchar(512) DEFAULT NULL COMMENT '评论内容',

`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

PRIMARY KEY (`id`),

KEY `owner_id` (`owner_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论表';

相比之前添加了父评论id pid ,去掉了用户头像。owner_id 是被评论的资源id,比如一个项目下的所有评论的 owner_id 都是一样的,便于根据资源 id 查找该资源下的所有评论。

与数据表对应的实体类 CommentsInfo

package com.solo.coderiver.comments.dataobject;

import lombok.Data;

import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.Entity;

import javax.persistence.Id;

import java.io.Serializable;

import java.util.Date;

/**

* 评论表主表

*/

@Entity

@Data

@DynamicUpdate

public class CommentsInfo implements Serializable{

private static final long serialVersionUID = -4568928073579442976L;

//评论主键id

@Id

private String id;

//该条评论的父评论id

private String pid;

//评论的资源id。标记这条评论是属于哪个资源的。资源可以是人、项目、设计资源

private String ownerId;

//评论类型。1用户评论,2项目评论,3资源评论

private Integer type;

//评论者id

private String fromId;

//评论者名字

private String fromName;

//被评论者id

private String toId;

//被评论者名字

private String toName;

//获得点赞的数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值