例子:有一张表:ArticleTable,其中有playCount,upCount,commentCount分别用来记录浏览数,点赞数跟评论数
为什么选择redis:对于一篇比较热的文章,容易出现同一时刻成百上千的浏览跟点赞等操作,如果针对这些操作即时的进行MySQL的update那么会出现并发锁问题,导致应用体验性不好。而redis作为一个支持高并发读写的内存nosql,每秒能支撑几万的写操作(网上资料这么说,我自己也没实际测过,但是试过一万的并发写是没问题的)
业务场景:需要有个列表能够展示最新的文章列表,每页展示10页。列表中需要有点赞数,浏览数,评论数
存储方案:
ArticleTable基本信息:持久化存储到Mysql(包括各种数)来确保数据完整性。
将playCount,upCount,commentCount存储到redis中
在redis使用什么结构存储:
使用Hash结构来进行存储,其中key为ArticleTable;(也可以根据key的hash值分别存储到多个hash结构中,针对量比较大的情况)
field为playCount:ArticleTable.id,upCount:ArticleTable.id,commentCount:ArticleTable.id;
value为播放数
每次有用户操作时可以根据ArticleTable.id对相应的内容进行递增操作
在每次列表查询的时候遍历一下结果集,然后根据结果集的Id去redis中获取播放数,点赞数,评论数并赋值到结果集中返回,以来实现各种数量的实时性。
然后定时间(根据业务需求)将redis同步到mysql:写一个定时程序,使用hgetAll获取全部,然后遍历update到mysql(当然这是数据量不会特别大的情况下才能这样粗糙的去做)