前言
我们APP上有社交模块,就涉及到点赞,关注操作。我们如何做到点赞操作,关注操作,能够实时的反馈呢?
方案分析
如果想要高性能,那么我们肯定是不能直接去操作数据库的。因为在APP中,这种互动操作会特别的频繁。如果直接写库的话会直接干崩溃数据库的。所以对于这些操作我们是直接操作Redis。这样才能保证实时性得到解决。但是也有需要解决的实际问题。如何保证双写一致?以及是否考虑定时刷盘的方式来刷入数据库
具体逻辑
对于用户的获赞,关注量,粉丝量 我们使用redis hash来进行存储。
- 个人中心流程图
2 点赞 关注操作流程图
可能会踩的坑
-
因为采用的策略是没有初始化的用户才会去初始化操作。如果在初始化操作的时候,假如来了很多的并发请求。就会出现同步Redis出现脏读的情况。
比如说。我们初始化时 A关注B C同一时刻也关注B。B还没有进行初始化操作。那么A操作时拿到的B粉丝量是0, 后面C拿到B的粉丝量也是0,然后这时候就会被初始化两次。导致出现数据不一致的情况。那我们在初始化的时候,可以对操作进行加锁操作。初始化过程中,如果有出现并发的情况。没拿到锁的话直接废弃掉改请求。保证数据的一致(当然,这种逻辑操作要根据业务类型来具体实现逻辑。
加锁的具体逻辑
使用redis的set来进行加锁操作。同时设置过期时间
public function setLock(string $key, $value, int $ttl = self::EXPIRE_TTL)
{
return self::$connection->set(self::getCacheKey($key), $value, 'EX', $ttl, 'NX');
}
总结
实现具体的逻辑有不同的方案,具体选择的方案需要根据业务实际情况来进行考虑。我们目前点赞,关注并发情况不是很高。所以能够一个个初始化进行操作。如果并发量很高的话,前面的方案可能会直接冲爆mysql。