【高并发-用户中心】读多写少的系统如何优化

news2024/11/18 9:30:48
  • 本博客纯属个人总结,非原创。
  • 喜欢技术交流的,可关注博主,武汉有后端开发群,可支持内推,了解武汉行情等。

如何对读多写少的系统进行高并发优化?

比如:用户中心是一个读多写少的系统,它经常喝多个系统重度耦合,固用户中心通常是系统改造中第一个要优化的模块,
读多写少的系统通过缓存能得到性能提升


数据梳理

任何老系统在做高并发改造(重构)时,都建议先做一次表的梳理。
现状:老系统在使用数据库时,会存在很多问题,比如:实体表字段过多,表之间关系混乱,用途多样,存在多对多关系等。

先梳理数据库结构,再对系统进行高并发改造是有帮助的。

精简数据会有更好的性能

在这里插入图片描述
用户中心是读多写少的数据,主要功能是维护用户信息,用户权限,登陆状态

(读多写少)优化手段:将用户中心和业务彻底拆开,不再于业务耦合,并适当添加缓存来提高系统性能。

举例说明:有张表接近2000万的账户表,对表功能和字段进行业务解耦和精简,让用户中心的账户表只保留用户登陆所需要的账号,密码。

CREATE TABLE `account` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `account` char(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` char(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `salt` char(16) COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` tinyint(3) NOT NULL DEFAULT '0'
  PRIMARY KEY (`id`),
  UNIQUE KEY `login_account` (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

精简:减少账户表字段的核心在于,长度小的数据再吞吐,查询,传输上都很快,方便管理+缓存。精简数据量虽然能换来更好的响应速度,但不提供过度设计,我们需要在 "更多的字段 " 和 “更少的职能” 之间找到平衡

总结:通过精简表的职能来提高表的性能和维护,同时需要在更多的字段和更少的职能之间找到平衡。


数据的归类及深入整理

目的:对不同类型的表做不同方向的缓存优化。

数据主要有四种:实体对象主表,辅助表,实体关系,和历史数据。
错误场景:将用户来访记录历史,放进缓存中,记录的目的是统计有多少好友来访,有多少陌生人来访,它同时保存着和用户是否是好友的标志。

需求:好友关系发生变化,历史数据需要同步更新

在这里插入图片描述
将历史记录和需要实时更新的好友状态混在一起,是不合理的,我们应该拆分成三个职能表,分别进行管理:

  • 历史记录表:不做缓存,仅展示最近几条,极端情况临时缓存。
  • 好友关系:缓存关系,用于统计有几个好友。
  • 统计数字

数据实体表:主表,一行数据代表一个实体,拥有一个独立唯一的ID作为标识,实体代表着抽象的事物,实体中的字段是当前实体的动态属性,这类表是针对业务的主要查询需求而设计的。

一个人代表着一个实体,一个人中有很多器官表示属性。

ID是很重要的,用户登陆后用自己的账户ID直接找到对应的订单,用户信息和好友信息,但是业务除了按照ID查找,还需要一些组合条件,比如:

  • 在7月4日下单购买耳机的订单有哪些?
  • 天津的用户里有多少新注册的用户?有多少老用户?
  • 昨天是否有用户名前缀叫rick的账号注册?
  • count(), sum()

这种根据条件查询统计的数据是不太容易做缓存的,高并发服务缓存的数据通常是能够Hash直接匹配的数据,因此这类数据只适合存在关系数据库中或提前作为热点数据放到缓存中直接使用,不能频繁查询,在高并发系统中要减少使用数据库做计算

总结:实体表的核心思路有以下几点

  • 精简数据总长度,要从更多的字段和更少的职能中进行权衡。
  • 减少表承担的业务职责。
  • 减少统计计算查询。
  • 实体数据更适合放进缓存中
  • 尽量让实体能够通过ID或关系方式查找
  • 减少实时条件筛选方式的对外服务。


实体辅助表:对主表拆分,常见的方式是纵向表拆分

纵向表拆分的目的:把主表使用频率不高的数据搬出去,精简主表的职能,实体辅助表和主表的关系一般是1:1。
.
比如账户主表用于登陆,而辅助信息表保存着家庭地址,省份,微信,邮编等平时不会展示的信息,目的是辅助查询。

实体关系
在这里插入图片描述
针对m:n的实体关系,一般推荐再加一个关系表来记录,这样两个实体就不用相互依赖,导致难以维护。

历史数据表:记录数据实体的动作或状态变化过程,比如用户登陆日志,用户积分消费等,这类数据会随着时间不断增长,不建议用在业务的实时统计计算上,如果真的需要统计,建议维护一张实时查询统计表会更好。

总结

  • 根据当前的业务逻辑对比数据表进行职能归类,精简主表,要在更多的字段和更少的职能中做权衡,
  • 数据可分为四类:实体主表,辅助表,实体关系表,历史表。

在这里插入图片描述

读多写少场景如何解决更新缓存不同步问题

只有热点数据放到缓存中才有价值。
在某一刻内,将查询用户信息频繁的数据放进缓存中,设置过期时间,简称:临时缓存

设置过期时间的好处是:能帮我们节省内存,节约钱。

缓存更新不及时问题

临时缓存是有过期时间的,如果60秒内去数据库中修改了用户信息,缓存是不会马上更新的,需在60秒后才会刷新这个用户的昵称缓存,解决办法如下:

  • 单点实体数据缓存刷新
    更新用户昵称,先更新数据库,然后清理缓存,让下次读取时刷新缓存。
  • 关系型和统计型数据缓存刷新
    订阅数据库来找到ID数据变化,将Binlog变更信息推送到MQ内,在消费的时候更新对于的缓存。

长期热数据缓存

当过期时间到期时,如果大量缓存请求没有命中,透传的流量会进入数据库,这就是常见的缓存穿透问题,数据库若扛不住流量,我们就不能使用临时缓存的方式去设计缓存系统,只能使用长期缓存这种方式来实现热点缓存。
如果热key过期,大量请求进入数据库层,我们可以利用"热点数据重建"手段,对查询条件进行加锁,让一个线程获取锁去数据库中查询,重建数据,其他线程阻塞,待重建数据完成后,也就避免了大量流量进入数据库。

如何降低用户身份鉴权的流量压力

目的:如何用token算法降低用户中心的身份鉴权流量压力
历史版本:在用户登陆成功后,将用户信息写在服务端的session缓存中,并分配一个session_id保存在cookie中, 该用户每次请求会带上这个ID,用来获取用户信息。
在这里插入图片描述

注意:其他系统每次拿到ID,都需要去用户中心获取用户信息,全站的请求都会对用户中心进行访问一次,影响到响应速度,决定了QPS上限。

如何降低用户中心与各个子系统间的耦合度,提高系统的性能呢?

  • JWT登陆和token校验
    常见的方式是签名加密的token,用户登陆后将用户信息放到一个加密签名的token中,每次请求都把这个token放到header或cookie内,带给服务端,服务端直接解析token获取用户的信息,无需和用户中心做任何交互请求
    服务端和用户中心解耦,业务服务端直接解析带来的token,即可获取用户信息,无需每次请求都去用户中心获取,token的刷新完全可以由App客户端主动请求用户中心来完成,而不再需要业务服务端去用户中心更换。

如何实现机房之间的数据同步

如何保证多机房数据的一致性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/349866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux定时备份MySql数据库

一、创建文件 cd / mkdir mysqlbackup vi mysqlbackup.sh然后将下面的代码更改后复制上去即可。 #!/bin/bash mysqldump -uroot -ppassword database > /mysqlbackup/database__$(date %Y%m%d_%H%M%S).sqlpassword指的是MySql的密码,database指的是所要备份的…

【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】

💃🏼 本人简介:男 👶🏼 年龄:18 📕 ps:七八天没更新了欸,这几天刚搞完元宇宙,上午一直练🚗,下午背四级单词和刷题来着,还在忙一些学弟…

leaflet: 禁止拖拽、禁止zoom(双击、滚轮、键盘)、禁止tap(076)

第076个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中设定各种禁止状态,这里设置了禁止拖拽、禁止zoom(双击、滚轮、键盘)、禁止tap。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共73行)相关A…

linux高级命令之多进程的使用

多进程的使用学习目标能够使用多进程完成多任务1 导入进程包#导入进程包import multiprocessing2. Process进程类的说明Process([group [, target [, name [, args [, kwargs]]]]])group:指定进程组,目前只能使用Nonetarget:执行的目标任务名…

电商导购CPS,京东联盟如何跟单实现用户和订单绑定

前言 大家好,我是小悟 做过自媒体的小伙伴都知道,不管是发图文还是发短视频,直播也好,可以带货。在你的内容里面挂上商品,你自己都不需要囤货,如果用户通过这个商品下单成交了,自媒体平台就会…

【刷题笔记】--搜索二维矩阵 II

题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16…

设计师都在看的全球设计网站,你居然还不知道!

设计师需要拥有无限的创意和熟练的技巧,并且对行业的前景和客户的心理有一定的了解。要能达到“陌生化”之前,肯定是有知识储备,专业能力的前提要求,以及创新能力。 今天为大家整理了多个优秀全球设计网站,这些博客内…

大家都在聊的自动化办公到底是什么?

自动化办公无非是excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,下面就详细介绍一下!文章最后分享了很不错的python学习教程,适合零基础初学的小伙伴,希望可以对你有所帮助!! excel自动化 我…

linux基本功系列之grep命令

文章目录前言一. grep命令介绍二. 语法格式及常用选项三. 参考案例3.1 搜索文件中以root开头的文件3.2 搜索文件中出现的root3.3 搜索除了匹配行之外的行3.4 匹配的部分使用颜色显示3.5 只输出文件中匹配到的地方3.6 输出包含匹配字符串的行,并显示所在的行数3.7 统…

Unity CircleLayoutGroup 如何实现一个圆形自动布局组件

文章目录简介实现原理Editor 编辑器简介 Unity中提供了三种类型的自动布局组件,分别是Grid Layou Group、Horizontal Layout Group、Vertical Layout Group,本文自定义了一个圆形的自动布局组件Circle Layout Group,如图所示: Ra…

Maven的安装步骤(保姆级安装教程)

一、安装本地Maven 选择你需要的maven版本下载:官网下载传送门 我使用的是3.6.1版本:maven-3.6.1-bin.zip 二、安装 把下载好的maven压缩包解压到一个没有中文,空格或其他特殊字符的文件夹,如: 三、配置环境变量…

Python 编程必备:盘点nginx和gunicorn的几大用法,建议收藏

程序员是新兴技术工种中比较高薪的一个,在互联网公司,程序员往往与秃头,压力大,找不到女朋友等等挂钩。 最近,最新技能类榜单出炉,这是一个关于程序员自己给自己贴的几个标签。 其中,不难看出…

美国CPC认证是什么?儿童玩具亚马逊CPC认证审核有哪些问题?

很多卖家都有遭遇listing下架,被要求提供CPC认证报告。这是因为亚马逊有时会加强对儿童产品的审查。本文带大家对CPC认证进行一个全面了解。什么是CPC认证?CPC认证,全称ChildrensProductCertification.是认可实验室,根据产品不同适…

Hive学习——单机版Hive的安装

目录 一、基本概念 (一)什么是Hive (二)优势和特点 (三)Hive元数据管理 二、Hive环境搭建 1.自动安装脚本 2./opt/soft/hive312/conf目录下创建hive配置文件hive-site.xml 3.拷贝一个jar包到hive下面的lib目录下 4.删除hive的guava,拷贝hadoop下的guava 5…

Java中常见的编码集问题

收录于热门专栏Java基础教程系列(进阶篇) 一、遇到一个问题 1、读取CSV文件 package com.guor.demo.charset;import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; import java.util.L…

Syntax-Aware Aspect-Level Sentiment Classification with PWCN 论文阅读笔记

一、作者 Chen Zhang, Qiuchi Li, and Dawei Song. 2019. Syntax-Aware Aspect-Level Sentiment Classification with Proximity-Weighted Convolution Network. In Proceedings of the 42nd International ACM SIGIR Conference on Research and Development in Information …

jsp游泳馆门票管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp游泳馆门票管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,…

MySQL的存储引擎

目录 一.概念 二.分类 操作 修改默认存储引擎 一.概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不…

数据预处理——数据无量纲化(归一化、标准化)

文章目录1. 数据归一化1.1 数据归一化定义1.2 MinMaxScaler 归一化1.3 MinMaxScaler 使用样例2. 数据标准化2.1 数据标准化定义2.2 StandardScaler 标准化2.3 StandardScaler 使用样例StandardScaler和MinMaxScaler选哪个?在机器学习算法实践中,我们往往…

儿童玩具车扭扭车上架欧盟亚马逊CE认证EN71项目测试

扭扭车又称儿童健身车,摇摆车,主体由工程聚丙烯,经注塑而成,结构稳固,操作简单,无需电瓶和传动装置,只要左右转动方向盘,就可随意前后行驶。是一种环保的绿色玩具,最早出现在中国台湾…