抖音极简版性能优化-1 | 青训营笔记

107 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天

概述

有些高并发操作,例如点赞、评论等,如果服务端直接与数据库进行交互,则会大幅增加数据库的压力,造成客户端响应时间过长,甚至发生宕机问题,因此在保证点赞、评论等基础模块的功能不受影响的前提下,要优化sql查询,增加缓存,充分利用go的协程,提高系统并发性能。

增加缓存采用Redis,在点赞、评论服务调用数据库前加上缓存,点赞和评论服务优先查询Redis缓存数据库,若读操作命中Redis相关信息,则直接返回,并更新Redis生存时间,否则访问数据库,并将相关信息写入Redis,设置Redis生存时间;若写操作命中Redis相关信息,则直接修改Redis,并更新Redis生存时间,此时为了保证Redis和数据库的数据弱一致性,则也要向数据库中写入相关信息,考虑到数据库并发不能过大,采用RocketMQ消息队列,来做缓冲,将相关操作信息写入消息队列,然后服务端取出消息队列进行消费,即对数据库进行更改,这样就能避免因为数据库并发过大而出现异常,若写操作没有命中Redis相关信息,就直接修改数据库,并将相关数据缓冲Redis。

脏读处理:

使用缓存进行性能优化提升后,需要解决一个新的问题,即数据的脏读问题。在多个用户进行删除、读取操作时,若某一个操作恰好将缓存中的数据清空,而此时数据库还未来得及对数据做出同样的操作(脏数据),此时,读取数据的用户在读取不到缓存中信息的情况下,很可能将数据库中的脏数据重新写入缓存,此时就会出现大量用户读取到脏数据且无法恢复正确值的情况。 针对上述情况,计划对缓存中的键值设置一个固定的、不会被删除的id值,即使用-1作为首次添加新key时对应的预设value值。为了防止出现键值数据永不删除的情况,采用设置键值有效期的方式在首次添加新键值时为键值设置有效期一个月。间硕