以咱们论坛为例,聊一个常见的场景:使用 Redis
, 记录帖子的点击数和喜欢数; 其他信息 (例如创建时间) 存在 MySQL
中
现在问题来了,苦逼的程序员拿到了这样的需求:
实现类似的需求的最佳实践是什么呢?或者问题更广泛一些,Redis
关系数据库
如何混用?
Tks in advance~
我工作的项目也是 mysql,redis 混用,redis 一般做聊天系统,排行榜,存储用户的一些临时数据,我觉得你说的这个需求不太适合 redis 的使用场景吧
针对你提到的例子,我想可以这样子解决:
同时在 MySQL 里存储一份数据,也就是说帖子的喜欢数和点击数同时也放在帖子表(或者新建一张帖子统计信息表),因为实时更新 MySQL 可能导致性能问题,可以定期同步数据,比如每天凌晨的时候跑一个任务更新数据表。 这样就可以使用 MySQL 查询过滤获取所需数据,但是存在数据不那么精确问题,需要考虑需求方能否接受。
推广到更广泛的问题,因为 Redis 和 MySQL 分开存储,如果业务需要联合使用这两部分的数据,就需要聚合数据,简单的聚合数据可以在程序里完成,复杂的聚合可能需要在 MySQL 同时保持数据的副本,而且可能导致数据非实时同步问题。
再广泛的情况,聚合数据,还可以通过建立数据集市(数据仓库),导入专门的检索系统(比如 solr / elastic search)完成。
简单玩的话老老实实把 redis 作为 cache 构成 tied storage。 点击数喜欢数先写在 redis 里,然后每隔一段时间 flush 到 db 里去就好了。 等你的论坛已经大到计数会影响性能的时候,这一段时间的延迟已经根本不是问题了。
实测统计数据先存在 redis 然后再写入数据库,对于每分钟批量更新约 15000 请求来说,在一台 i5 的机器上 CPU 消耗不会超过 5%。 根本不是瓶颈。
@jasonliu @hooooopo @Rei @42thcoder @msg7086 可能对于论坛帖子的例子优化的必要性不大,但楼主提到的情形还是有很多现实的场景。
例如:有很大的用户表 users(数千万),用户有一些属性包括性别,年龄,地区等等,另外通过 redis 记录用户最新访问时间,业务上有很多筛选客户的需求,需要组合各种属性条件和最新访问时间,这个时候就需要聚合数据了。
#13 楼 @cassiuschen 的确和数据分离解决问题思路有点儿类似,但还是很大不同,这里相当于异构数据库(NoSQL 和 SQL)的数据聚合,历史数据分离通常还是在同一种数据库中进行。