爱收集资源网

高并发点赞问题(Redis)服务器异步处理

网络整理 2024-02-10 22:05

高并发点赞问题高并发恳求下,服务器频繁创建线程。高并发恳求下,数据库联接池中的联接数有限。高并发恳求下,点赞功能是同步处理等。解决办法:第一步

我们通过引入Redis缓存避开高并发写数据库而导致数据库压力,同时引入Redis缓存提升读的性能,基本可以解决问题。

第二步

为了解决高并发恳求下,点赞功能同步处理所带来的服务器压力(Redis缓存的压力或数据库压力等),我们引入MQ消息中间件进行异步处理,用户每次点赞就会推送消息到MQ服务器并及时返回,这样用户的点赞恳求就及时结束点赞关注网站,防止了点赞恳求线程占用时间长的问题。与此同时,MQ消息中间件接收到消息后,会根据“自己的方法”及时消费,还可以用MQ消息中间件来限制流量并进行异步处理等。

整个流程,如右图所示

详尽设计1.Redis数据结构设计使用set来储存被点赞的类型id,key为被点赞类型名,value为类型idhash储存某个类型点赞的记录点赞关注网站,key为类型名+类型id,hashKey为点赞人,hashValue为点赞时间

2.表设计

DROP TABLE IF EXISTS `user_like`;
CREATE TABLE `user_like`  (
  `like_id` int NOT NULL AUTO_INCREMENT,
  `type` tinyint(1) NULL DEFAULT NULL COMMENT '0:帖子,1评论,2:回复',
  `type_id` int NULL DEFAULT NULL COMMENT '点赞类型id',
  `status` tinyint(1) NULL DEFAULT NULL,
  `user_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `like_time` timestamp(0) NULL DEFAULT NULL,
  PRIMARY KEY (`like_id`) USING BTREE,
  INDEX `del_index`(`type`, `type_id`, `user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10101 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

第三步代码设计

1.点赞类型因为分成三种,所以使用策略+鞋厂模式取代ifelse去执行点赞功能,依照前台传过来的type进行判定,典雅美观。

2.使用mq来进行异步处理,每次恳求进来,把信息传给mq后,直接返回后端传给点赞同功信息,前面mq收到消息后在进行处理。

3.最后晚上把储存在redis的数据写入到数据库中,形式为:添加redis中有的数据库中无记录的,删掉redis没有数据库中有的记录,由于点赞取消是直接在redis中删掉。

第四步上代码

参考:redis高并发点赞功能的开发

点赞关注网站