Java架构直通车——点赞功能用Mysql还是Redis?

2023-11-01

引入

最近遇到一个需求,就是做联盟链做存证上,部分交易对外公开,或者是对指定人可见。之前一直在思考用Mysql怎么存合适,想来想去也没找出个合适的办法。
点赞功能场景和上面的需求是一样的,我就借这个简单一些的点赞功能来理清下思路把。

我们先看点赞功能的需求:

  • 显示点赞数量
  • 判断用户是否点过赞,用于去重,必须的判断
  • 显示个人点赞列表,一般在用户中心
  • 显示微博/文章的点赞列表

在这里插入图片描述
微博这是头部的顶级流量,后端肯定是有复杂架构的,我们今天暂时只讨论大众化的方案。

使用Mysql实现点赞功能

采用mysql做点赞功能的记录的话,一般是要三个表:

  1. 用户表。
  2. 文章表。
  3. 用户-文章关联表(点赞表)。

那么点赞功能常用的查询就是:

  • 查询某一篇文章的点赞的用户:
    select user_id from star where post_id=?
  • 查询某一用户点赞过的文章:
    select post_id from star where user_id=?

虽然我们这里讨论的是大众化的方案,但不是说的数据量小,只是说的架构简单。

我们思考下,如果使用单表查询,一个表肯定是支撑不住的,即使建立了两个索引数据库表的压力也是很大的。
这时只能考虑分库分表,那么怎么分表成为了一个难题:是按照用户id分还是文章id分呢?因为不用的查询,有时涉及到分表后的单表,有时涉及到多表。这样Hash起来是有冲突的
那么只能考虑做两个分表的冗余,不过这增加了存储空间和维护工作量,还可能有一致性问题。

所以,使用mysql来做点赞功能,不是很好。

使用Redis实现点赞功能

由于点赞这种动作很随意,很多人看到大拇指就想点,所以数据量增长很快,数据规模上来后,对mysql读写都有很大的压力,这时就要考虑redis了。

采用redis有两种用途,一种是storage,一种是cache

使用什么数据格式最合适?

Redis具有丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。

在这里插入图片描述

Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。type 表示一个 value 对象具体是何种数据类型,encoding 是不同数据类型在 Redis 内部的存储方式。

比如:type=string 表示 value 存储的是一个普通字符串,那么 encoding 可以是 raw 或者 int。

  • String 是 Redis 最基本的类型,一个 Key 对应一个 Value。Value 不仅是 String,也可以是数字,也可以是对象的序列化。
  • Hash是一个键值(key-value)的集合。Redis 的 Hash 是一个 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。
  • List,List 列表是简单的字符串列表,按照插入顺序排序。Redis 提供了 List 的 Push 和 Pop 操作,还提供了操作某一段的 API,可以直接查询或者删除某一段的元素。
  • Set和ZSet不做赘述。当你需要一个有序的并且不重复的集合列表,那么可以选择 Sorted Set 结构。

我们可以看到使用点赞列表,最合适的方式还是Hash或者List了。如果需要记录点赞人和被点赞人,还有点赞状态(点赞、取消点赞),还要固定时间间隔取出 Redis 中所有点赞数据,使用Hash能够保存key和value,算是更合适的了。

关于底层编码的实现方案,我以后的文章会做介绍。

方案


  • 使用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列表,以tid为key。

场景c:一般在用户中心,可以看到用户自己的点赞列表
这个需求和上面的差不多。

场景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

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


  • 使用redis做为cache的方案:

基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。

这一点,以后有机会再做详细介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java架构直通车——点赞功能用Mysql还是Redis? 的相关文章

  • uniapp+vue3+vite+ts+uviewPlus搭建项目

    创建项目架构 首先使用官方提供的脚手架创建一个项目 这里我创建的 vue3 vite ts 的项目 npx degit dcloudio uni preset vue vite ts project name 如命令行创建失败 请直接访问
  • python selenium启动常用

    加载超时设置 browser set page load timeout 5 二进制转16进制 a 00000000 hex int a 2 from selenium import webdriver import time from s

随机推荐

  • Python学习-----流程控制3.0(习题实操)

    目录 前言 1 求和 2 求阶乘 3 输出100以内的奇数 4 打印九九乘法表 5 斐波那契数列 6 打印空心矩形 7 打印三角形 8 求两个数字之间的最大公约数 9 质数问题 10 进制数转换 11 字符统计 12 字符匹配问题 13 求
  • 终于有人把数据指标体系讲明白了

    来源 数据学堂 数据岗的核心职能 在于产出数据资产 提升信息的价值密度 而指标体系就是一个组织最为重要的数据资产 那么 1 为什么指标体系这么重要 2 什么是指标体系 3 指标体系的衡量标准是什么 4 如何去搭建一套好的指标体系 只要弄清楚
  • C++ primer 第十一章习题

    chapter11 关联容器 文章目录 chapter11 关联容器 练习 11 1 节练习 练习11 1 练习11 2 练习11 3 练习11 4 11 2 1 节练习 练习11 5 练习11 6 练习11 7 练习11 8 11 2 2
  • 脏牛提权(cve-2016-5159)

    漏洞范围 大于2 6 22版本 2007年发行 到2016年10月18日修复 危害 低权限的用户可利用这一漏洞在本地进行提权 原理 linux内核的子系统在处理写入时复制至产生了竞争条件 恶意用户可利用此漏洞来获取高权限 对只读内存映射进行
  • 如何快速选择开源许可证License,看这三个就够了

    开源License很多 如果你不想在License耗费太多精力 那么推荐你重点了解这三种 GPL Apache License及MIT 这三种在开源License中很具代表性 使用广泛 且简洁易理解 同时 这三种license是经过OSI
  • MySQL数据库学习

    目录 从管理员cmd页面打开数据库 创建一个用户 数据库的基本操作 数据完整性 完整性约束管理 表的基本操作 判断关键字 聚合函数 多表连接查询 嵌套查询 联合查询 事务 锁 索引 视图 存储过程 函数 与存储过程类似 光标 触发器 JAV
  • lazarus调用http接口解析json(迎接云计算适应微服务)

    lazarus 跨平台free pascal语言ide工具 社区 http www fpccn com 下载 ftp freepascal dfmk hu pub lazarus 号称一次编码 到处编译 window linux macos
  • 制造业数据治理白皮书(2022版)

    全书基于双方赋能一线制造业企业数字化转型过程的实操践行 经验沉淀和所感所悟 分别从背景及趋势 现状与挑战 实施途径 典型案例等角度揭示了当下制造业数据治理的重要性 关注公众号 互联互通社区 回复 DATA176 获取全部报告内容 精彩推荐
  • ES集群宕机后处理——重新分配shards,负载均衡

    ES集群5台机器 由于同时读写导致其中一台机器宕机 原本每天的索引shard数设定为10 这样5台机器每台分配2个shard 但是一旦集群宕机 重启集群后 5号机器宕机导致它上面的shard会转移到其他1 4号机器上 如果此时往ES里写数据
  • UE4_DatatTable数据保存

    UE4 提供了很多数据持久的工具 很多 1 2 3 网上使用UE4 c 操作DataTable的也很多 不接入别人的链接了 使用C 操作DataTable修改数据也没啥大的问题 坑爹的地方 修改完数据之后 重启编辑器之后 修改的数据恢复之前
  • 线性、非线性分类器&数据的线性、非线性

    线性 非线性分类器 数据的线性 非线性 一 线性分类器 有无数个可划分这两个线性可分类的超平面 在二维空间里面 一个线性分类器是一条线 图14 8展示了五个分类例子 这些线有一个函数形式w1x1 w2 x2 b 线性分类器的分类规则是 如果
  • Unity如何使用手机进行调试(真机)

    文章目录 手机操作 具体步骤 Unity操作 错误处理 没有检测到手机 手机操作 首先打开手机的 USB调试 开关 具体步骤 这里以华为手机举例 手机的系统是EMUI10 具体操作如下 首先打开手机 gt 进入 设置 找到 关于手机 连续点
  • linux内核模块作用,Linux内核模块(二)

    ko kernel object so shared object root rhel6 ls lib modules uname r kernel arch x86 kvm kvm amd ko kvm intel ko kvm ko 通
  • 强化学习奖励和状态设计

    奖励 1 稀疏奖励问题 2 奖励模式化问题 3 奖励不能太过于全局化 4 记住一些常用的奖励设置方式 5 逆向强化学习自动涉及回报函数 6 避免奖励异常问题 贪婪 来回踱步 胆怯 不敢走 主线奖励太小 鲁莽 惩罚不够 7 采用reward
  • Excel文件导出总结,包含大数据量的分批导出方式

    文章目录 更新记录 需求背景 参考内容 导出方式 代码实现 Excel4J 普通导出 POI原生方式 普通导出 大数据量分批导出 2023 08更新 实际应用记录 依赖版本 实现思路 POI工具类 数据写入 调用测试 测试结果 一个小意外
  • 云原生Kubernetes:K8S实用插件和工具

    目录 一 理论 1 Kubectl插件 2 kubens 3 krew 二 实验 1 kubectl插件 2 kubens 3 krew 一 理论 1 kubectl插件 1 概念 kubectl插件其实就是以kubectl 为前缀的任意可
  • 最喜欢的科技资讯类英文网站

    最喜欢的科技资讯类英文网站 1 手机类 http www phonearena com 喜欢原因 全球主要机型的手机都有罗列 新闻更新速度非常之快 上市未上市机型都能涵盖 2 计算机类 http www computerworld com
  • 史上最简单的SpringCloud教程

    在上一篇文章 讲了服务的注册和发现 在微服务架构中 业务都会被拆分成一个独立的服务 服务与服务的通讯是基于http restful的 Spring cloud有两种服务调用方式 一种是ribbon restTemplate 另一种是feig
  • C语言———打印100—200之间的素数并统计素数个数的三种写法

    素数 除了1和它本身以外再无其他因子 1 试除法 判断i是否时素数 则用2 gt i 1个数去整除i 若可以整除 则说明i不是素数 int main int i 0 用i记录100 200之间的数 int count 0 用count统计1
  • Java架构直通车——点赞功能用Mysql还是Redis?

    文章目录 引入 使用Mysql实现点赞功能 使用Redis实现点赞功能 使用什么数据格式最合适 方案 引入 最近遇到一个需求 就是做联盟链做存证上 部分交易对外公开 或者是对指定人可见 之前一直在思考用Mysql怎么存合适 想来想去也没找出