1
2
3
4
5
6
7
8
//todo 将用户评论、点赞、收藏、系统消息发送到 RabbitMQ,统效率和服务稳定性;实现消息的异步解耦.  (点赞、收藏 业务优化)
//todo 利用 AOP 切面技术,当系统收到新的消息时(如评论、点赞等),自动将这些消息发送至 Kafka 消息队列中。接着,通过消费者服务从 Kafka 中取出消息,并将其存储到Redis 缓存中等待用户消费(推拉结合),这一过程既确保了消息处理的高效性,也增强了系统的可靠


//todo 通过 AOP +TracelD 记录接口访问日志,实现任务的追踪、监控和诊断。
//todo 集成本地缓存 Guava 和 Caffeine,有效提高服务的吞吐率、QPS 近 30%;
//todo 采用自旋锁策略优化缓存架构,针对热 key的并发访问进行同步,防止其失效时导致的缓存击穿:
//todo 结合 MyBatis 拦截器和 DFA 算法实现了一套完善的敏感词自定义过滤方案,确保了社区内容的健康和安全。

点赞、收藏

点赞收藏其实业务基本相同、一整个流程就是:

1、判断用户是否已经点赞

2、关系表插入数据

3、点赞数+1

取消点赞也是类似,以上代码不加锁会有并发问题

优化:

1、关系表插入数据(关键字段添加索引)

2、点赞数+1

当用户已经点赞了,第一步就会抛出异常,优化的方案相对于第一版方案的优点如下:

1、不需要添加锁

2、减少了与数据库通信的次数

排行榜(实时)

常规:使用zset来维护,zset中保存所有的数据,然后维护好这个zset就行了。

缺点:这个方案需要redis保存所有的数据

优化:

我们可以根据网站的qps来保存部分数据,实现实时排行榜(百人)的功能

举例:假设我的网站每分钟最多有900个score add 的操作,

那么我们可以每分钟获取数据库中前1000的数据,之后用户add score的时候,如果此条记录在redis中没有就更新数据库中的记录

如果redis中有的话就俩个都更新

这样能实时吗?

因为我们的每分钟访问量为900,那么就算你这一分钟一直在add排行第1001的记录,他也不可能进入到前100的排行榜中,他最多从第1001提升到第101

房间人数上限维护

由于redis没有 set and if 的原子操作,那么 set 一个数字 并判断是否超过某个数字的话就需要加锁或者使用lua脚本,非常的不优雅,

那么有什么办法可以不加锁也不使用lua脚本呢?

思路:

我们知道redis 中 整数的最大值是int64来进行保存的,而且incr num 超过最大值会返回0,那么我们可以使用这一特性来完成房间人数上限的维护

1、在我们初始化房间时,人数设置为 int64能保存的最大值 - 房间人数上限

2、用户加入房间的时候判断incr 的返回值 看是否成功执行

2、

3、

4、

5、

6、

7、