点赞功能是目前app开发基本的功能
最近在研究小程序评论这块,顺便来点干货…
就来聊聊 点赞、评论、收藏等这些场景的db数据库设计问题,

  1. 我们先来看看场景的需求:

显示点赞数量
判断用户是否点过赞,用于去重,必须的判断
显示个人点赞列表,一般在用户中心
显示文章点赞列表
我们先看一下头条和微博的例子


这两个都是具有顶级流量的,后端肯定有复杂的架构,我们今天只谈大众化的方案。

2.1 mysql方案

mysql方案, 随着nosql的流行,大数据的持续热点,但是mysql仍然不可替代,对于大多数的中小项目,低于千万级的数据量,采用mysql分表+cache,是完全可以胜任的,而且稳定性是其他方案无可比拟的:
– 文章表

create table post {

    post_id int(11) NOT NULL AUTO_INCREMENT,......star_num int(11) COMMENT '点赞数量'

}

– 用户表

create table user {

    user_id int(11) NOT NULL AUTO_INCREMENT,......star_num int(11) COMMENT '点赞数量'

}

– 点赞表

create table star {

    id int(11) NOT NULL AUTO_INCREMENT,post_id,user_id,......

}

查询用户点赞过的文章 select post_id from star where user_id=?

查询文章的点赞用户 select user_id from star where post_id=?

点赞数量可以通过定时异步统计更新到post和user 表中。

数据量不大的时候,这种设计基本可以满足需求了,

缺点:

数据量大时,一张表在查询时压力巨大,需要分表,而不论用post_id还是user_id来hash分表都与我们的需求有冲突,唯一的办法就是做两个表冗余。这增加了存储空间和维护工作量,还可能有一致性问题。

2.2 redis方案

当数据量达到上亿的量,上cache是必经的阶段,由于点赞这种动作很随意,很多人看到大拇指就想点,所以数据量增长很快,数据规模上来后,对mysql读写都有很大的压力,这时就要考虑memcache、redis进行存储或cache。

为什么一般都选择redis, redis作为流行的nosql,有着丰富的数据类型,可以适应多个场景的需求。

采用redis有两种用途,一种是storage,一种是纯cache,需要+mysql一起。纯cache就是把数据从mysql先写入redis,用户先读cache,miss后再拉取MySQL,同时cache做同步。


多数场景二者是同时使用的,并不冲突。

下面说下redis作为storage的方案:

场景a :显示点赞数量

在点赞的地方,只是显示一个点赞数量,能区分用户是否点赞过,一般用户不关心这个列表,这个场景只要一个数字就可以了,当数量比较大时,一般显示为"7k" ,“10W” 这样。

以文章id为key

//以文章id=888为例
127.0.0.1:6379[2]> set star:tid:888 898 //设置点赞数量
OK
127.0.0.1:6379[2]> incr star:tid:888 //实现数量自增 (integer)
899
场景b:点赞去重,避免重复点赞

要实现这个需求,必须有文章点赞的uid列表,以uid为key场景c:一般在用户中心,可以看到用户自己的点赞列表

这个需求可以使用场景b的数据来实现。


场景d:文章的点赞列表,类似场景b,以文章id为key

//以文章id=888为例
127.0.0.1:6379[2]> sadd star:list:tid:888 123 456 789 //点赞uid列表 (integer)
3
127.0.0.1:6379[2]> sismember star:list:tid:888 456 //判断是否点赞 (integer)
1
点赞的地方,如果点赞过显示红色,没有则显示黑白色,

今日头条是没有地方可以看到点赞列表的,而微博点进去,详情页可以看到点赞列表,但是只会显示最近的几十条,没有分页显示。

如下图,我选了一条热点,拥有众多粉丝的“猪猪”


可能有人觉得,点赞列表没人关心,存储又会浪费大量资源,不如不存!但是,这个数据是必须要有的。两点:

去重。点赞数可以不精确,但去重必须是精确的,
另外一个社交产品,用户行为的一点一滴都需要记录,对于后续的用户行为分析和数据挖掘都是有意义的。
上面使用string存储的用户点赞数量,除了string,还可以用hash来存储,对文章id分块,每100个存到一个hash,分别存入hash table,每个文章id为hash的一个key,value存储点赞的用户id,如果点赞用户很多,避免id过多产生性能问题,可以单列出来,用sorted set结构保存,热点的毕竟是少数。

方案优缺点比对

hash:使用了更少的全局key ,节省了内存空间;但是也带来了问题

如何根据文章id路由到对应的hash?

查找一个用户id是在hash还是set?存在不确定性

使用hash虽然节省了空间,但增加了复杂度,如何选择就看个人需求了。

除此之外,你还有其他的方法吗?

  1. 数据一致性

redis作为storage使用时,一定要做好数据的持久化,必须开启 rdb 和 aof,这会导致业务只能使用一半的机器内存,所以要做好容量的监控,及时扩容。

另外只要有数据copy,就会有一致性问题,这就是另外一个很重要的话题了。以后有时间再细聊吧!

写在最后:把问题写明白,真不是一件容易的事情,请大家多多关注,留言,谢谢!

微信小程序点赞功能,用 MySQL 还是 Redis ?相关推荐

  1. 微信 php收藏功能实现,关于微信小程序收藏功能的实现

    这篇文章主要介绍了微信小程序收藏功能的实现代码,基本功能是点击收藏后显示已收藏,在另一个页面出现目前点击收藏的项目.需要的朋友可以参考下 需求 点击收藏后显示已收藏,在另一个页面出现目前点击收藏的项目 ...

  2. 微信小程序 点赞+评论(无限级评论回复)/带图评论解决方案

    微信小程序 点赞+评论(无限级评论回复)/带图评论解决方案 需求描述 实现要点分析 目录结构 前端功能方法集成 后端方法 数据库结构 效果展示 未解决的问题 需求描述 最近在思考一个需求:文章可以评论 ...

  3. 微信小程序-点赞业务实现

    微信小程序-点赞业务实现 这里写目录标题 微信小程序-点赞业务实现 一.效果 二.实现 1.逻辑 2.wxml 3.js 一.效果 二.实现 1.逻辑 1.从登录界面时,用户数据已经缓存到本地,在on ...

  4. 三步教你开通微信小程序直播功能

    3月8日,微信官方举办了 "女神节"微信小程序直播的活动,联合近千品牌小程序直播首秀,当天,每个用户平均观看直播时间超过了8分钟,人均点赞数达到了280次,分享次数最高的直播间达到 ...

  5. 微信小程序插件功能页开发详细流程

     有问题可以扫码加我微信,有偿解决问题.承接小程序开发. 微信小程序开发交流qq群   173683895  . 526474645 : 正文: 关于新出的微信小程序插件功能页做一下记录,希望能帮到大 ...

  6. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

  7. python个人微信支付接口_Python实现微信小程序支付功能

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  8. vc++6.0获取磁盘基本信息_微信小程序——常用功能2:微信小程序用户登录,申请用户授权并获取用户基本信息...

    微信小程序--常用功能2:申请用户授权并获取用户基本信息 为了更好的用户体验,很多时候我们想要获取用户的基本信息,从而实现将信息呈现到用户界面.给用户划分地域.给用户分类等功能. 但是要想获取用户信息 ...

  9. python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

最新文章

  1. 草根创业都选择的是什么人?
  2. PAT乙级-1056. 组合数的和(15)
  3. 沈阳大学计算机系教师,张春芳(信息工程学院)老师 - 沈阳大学 - 院校大全
  4. 判断字符串的长度,中文占两个字符
  5. rocksdb学习笔记
  6. win7一直显示正在启动_win7系统中提高启动速度并且禁用某些软件启动的操作小技巧...
  7. 信息学奥赛一本通 1066:满足条件的数累加 | OpenJudge NOI 1.5 10
  8. wegame饥荒一直连接中_谁是老牛?谁是嫩草?WeGame与老牌网游的故事 | 游戏茶馆...
  9. JAVA代码规范(二)
  10. JDK Frame内容区绘制边框
  11. 【控制】人工势场法及人工势场函数
  12. 基于排队论模型的收银台服务系统的分析及可视化设计
  13. Freepiano如何使用sf2音源,sfark如何转换至sf2?
  14. ip类「ABCDE五类」区分和私有ip地址的知识
  15. 如何做好项目中的风险控制
  16. 工业锅炉计算机控制系统框图,锅炉控制(汇总).ppt
  17. 无线传输 android下载,无线文件传输 WiFi File Transfer
  18. MySql 笔记(五)InnoDB引擎页分裂与页合并的原理
  19. npm安装失败及解决办法 error network tunneling socket could not be established
  20. [附源码]Java计算机毕业设计SSM高校体育馆管理信息系统

热门文章

  1. 软件保护器:Themida 3.1.14 Crack
  2. Unity3D-使用custom font字体以及重叠问题
  3. 2022年监理工程师合同管理考试每日一练及答案
  4. 三星s5刷机android+l,三星GALAXY S5怎么刷机 三星GALAXY S5刷机技巧教程
  5. matlab编程怎么收费,求matlab大佬帮忙编程写一个小公式
  6. imx6q:在应用层对视频输入源做裁剪(crop)不生效
  7. keil5安装新字体YaHei.Consolas,解决中文乱码问题
  8. LINX命令压缩和归档
  9. [Java]简单实现计时功能
  10. 基于centos7安装多实例mysql8.0完整版(超级详细)