- 博客(119)
- 收藏
- 关注
转载 实现大文件的断点下载、分片下载
(1)后端先探测Minio上的文件。断点下载就是在分片下载的基础上实现的,下载时候我们判断当前的分片是否是完整的下载(根据文件的大小为依据),最后一个分片根据文件大小我们不知道是否全部下载完成,所有最后一个分片直接去服务器上下载。(3)待最后的一个文件下载结束后开始做合并文件的操作,由于是多线程下载文件资源,可能会出现在合并的时候,某些文件还没有下载好,此时需要让合并文件的线程睡眠一小段时间等待文件下载结束后再去合并文件资源。(2)断点下载是在分片下载的基础上实现的,如果分片已经下载好了就不需要再次下载。
2024-07-18 16:16:57 361
转载 如何实现Redis和Mysql中数据双写一致性
这种方案下,在数据库更新成功后到删除Redis缓存数据之前的这段时间中,其他线程读取的数据都是旧数据,等Redis删除缓存后会重新从数据库中读取最新数据同步到Redis,这样可以在一定程度上保证数据的最终一致性。直到Redis中缓存的数据过期之后才可以从数据库中获取最新的到Redis中。经过上述的过程就导致了Redis的数据和数据库中的数据不一致了,即就是Redis中存放的依据是老数据。在redis一般写的场景下对数据的更新操作是不推荐使用的,推荐使用删除缓存数据的操作,因为删除操作的效率更高。
2024-07-18 16:04:35 93
转载 配置MySQL主从复制和读写分离
记住此处File和Position的值。的值替换成上述master上查询的值。经验证,已实现读写分离。创建数据库并添加数据。上授权数据库访问权限。上撤销数据库访问权限。
2024-07-15 17:02:21 61
转载 电商设计订单超时未支付关闭的方案整理
任务中心方案实现上简单,效率高、稳定性强、维护成本低(只需要搭建一套高可用的任务中心,所有的业务都可以复用),无需其他的处理就可以保证数据的最终一致性(下游业务操作失败,定时任务下一个周期可执行)。用户下单之后将订单数据保存在交易中心的订单库中,如果订单需要实现延时任务,此时将订单数据同步一份到任务中心中,任务中心的通过定时任务(如xxl-job、ElasticJob)来触发任务操作相关的逻辑。(3)订单量数据量很大(日均百万级别甚至千万),精度要求没有那么高的场景建议采用任务中心的方案。
2024-07-15 17:01:02 163
转载 面试官:让我看看你的Redis功力如何
Redis 中的事务是一组命令的集合,将一组需要一起执行的命令放到multi和exec两个命令之间。multi 命令代表事务开始,exec命令代表事务结束。它可以保证一次执行多个命令,每个事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行。但是要注意Redis的事务功能很弱。在事务回滚机制上,Redis只能对基本的语法错误进行判断。当语法命令错误时,会造成整个事务无法执行,事务内的操作都没有执行。而当命令错误时,虽然有异常提示,但是事务会执行成功。
2024-07-15 16:50:56 61
转载 讲讲MySQL的锁
全局锁就是对数据库的整个实例加锁, 加锁之后整个实例就处于只读状态,后续的DML写语句,DDL语句,以及更新操作的事务提交语句都会被阻塞,全局锁的典型使用场景就是进行全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。那么在线程 C 阻塞后,后续有对该表的 select 语句,就都会被阻塞,如果此时有大量该表的 select 语句的请求到来,就会有大量的线程被阻塞住,这时数据库的线程很快就会爆满了。共享锁不会阻塞其他事务的共享锁请求,但会阻塞其他事务的独占锁和排他锁请求。
2024-07-15 16:49:02 27
转载 高并发下千万数据量的Mysql中热点数据如何持续保留在Redis中
在某些热点数据访问量一样的,那么在淘汰数据的时候依据时间来淘汰,极端情况下被清理掉的热点数据下一时刻被大量访问,此时要做一下系统的保护(最简单的是加锁访问数据库)。此时将数据4移除就不适合了,因为它是使用次数最高的,只是最近时间没有被访问,极端的情况下可能因为大量请求来访问数据4,此时数据4在Redis中刚好被移除,那么请求将会都打到Mysql上进而导致Mysql被打垮。此方案存储热点数据比LRU方式更加合理,因为它只会清理那些不常用的数据,针对高并发下缓存大批量的热点数据建议采用这种LFU的方式。
2024-07-15 16:46:18 63
转载 Nginx最全详解(万字图文总结)
正向代理最大的特点是:客户端非常明确要访问的服务器地址,服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,正向代理模式屏蔽或者隐藏了真实客户端信息。由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上。
2024-07-15 16:43:34 326
转载 MySQL千万级数据从190秒优化到1秒全过程
首先要声明的就是,千万级数据对于MySQL来说就是不太合理的一个存在。优化MySQL千万级数据策略还是比较多的。分表分库创建中间表,汇总表修改为多个子查询这里讨论的情况是在MySQL一张表的数据达到千万级别。表设计很烂,业务统计规则又不允许把sql拆成多个子查询。在这样的情况下,开发者可以尝试通过优化SQL来达到查询的目的。当MySQL一张表的数据达到千万级别,会出现一些特殊的情况。这里主要是讨论在比较极端的情况下SQL的优化策略。
2024-07-15 15:42:54 44
转载 大文件秒传、断点续传和分片上传
如果当前的文件是没有上传过或者断点上传的时候,需要携带md5和分片信息请求后端,后端根据MD5查询Redis中上传文件的信息来申请凭证,如果是断点续传情况,需要过滤已经上传成功的分片再去申请凭证;(3)前端过滤上传成功的分片,将未上传成功的分片请求后端申请凭证,申请成功之后上传分片,上传完成就请求后端合并分片成完成的文件并保存文件的地址到数据库,删除分片记录。(5)断点续传的原理是记录已经完成上传的分片,再次上传的时候这些分片无需再次上传,只上传未完成上传的分片。核心的代码:。
2024-07-15 15:39:54 86
转载 Redis缓存的常用设计模式
Redis缓存的常用设计模式:一. 写操作:* 以Redis统一视图为准:先更新缓存,后更新数据库。1) Write Through Pattern 直写模式:首先将数据写入缓存,再将数据立即同步到数据库。2) Write Behind Pattern 写后模式:首先将数据写入缓存,再将数据异步的批量同步到数据库。* 写操作不经过缓存。3) Write Around Pattern 绕写模式:数据直接写入数据库,不经过缓存。
2024-05-24 15:25:52 109
转载 支撑瞬间百万QPS的热点文章服务的设计
(2)服务端获取到文件的地址后,将文章的地址写入数据库中,还要做热点文章预热工作:文章的信息缓存到redis、文章的信息发送到MQ中,MQ通过广播的形式将文章数据写入到文章微服务中本地缓存上(主要目的是做多级缓存来保证请求不会直接打到数据库上)。(3)调用方接收到云服务器的文件存储地址后保存到文章服务的Mysql、缓存一份文章信息(包括文章的id、文章的文件地址URL)到redis中、发送一个文章数据到MQ中(用户广播数据到本地缓存中)针对热点新闻的短时间大流量的请求,我们需要做相应的架构设计来支撑服务。
2024-05-20 10:00:05 41
转载 如何保证Redis缓存和数据库数据的一致性?
如线程1和2都是写操作,线程1先完成数据库写操作,然后线程2完成了数据库和缓存的写操作,之后线程1完成缓存写操作,那么此时缓存和数据库的数据就不一致了。部分面试官对缓存一致性的题目青睐有加。类比上述读写并发的场景,线程1读请求,此时缓存刚好失效了,就从数据库中读取了旧值,然后线程2更新数据库并操作清除了缓存,之后线程1更新旧值到缓存中。可见,出现该问题的条件还是比较苛刻的,尤其是第(3)个条件,一般情况下更新数据库都是比更新缓存要慢的,除非刚好线程1到缓存服务刚好出现网络抖动,才会出现该问题。
2024-05-20 09:58:58 57
转载 电商设计订单超时未支付关闭的方案整理
任务中心方案实现上简单,效率高、稳定性强、维护成本低(只需要搭建一套高可用的任务中心,所有的业务都可以复用),无需其他的处理就可以保证数据的最终一致性(下游业务操作失败,定时任务下一个周期可执行)。用户下单之后将订单数据保存在交易中心的订单库中,如果订单需要实现延时任务,此时将订单数据同步一份到任务中心中,任务中心的通过定时任务(如xxl-job、ElasticJob)来触发任务操作相关的逻辑。(3)订单量数据量很大(日均百万级别甚至千万),精度要求没有那么高的场景建议采用任务中心的方案。
2024-05-20 09:57:56 375
转载 Redis实现延迟队列的方案总结
实现思路:ZSet 是一种有序集合类型,它可以存储不重复的元素,并且给每个元素赋予一个 double 类型的排序权重值(score),所以可以将元素的过期时间作为分值,通过定时任务扫描的方式判断是否达到过期时间,从而实现延迟队列。Zset+定时任务的实现延迟任务的方式虽然比监听过期key方案合理一些,但是它还是存在一定的缺陷,如无重试机制、延迟时间固定化(依赖定时任务的执行时间)、不适用于大规模的延迟任务。下面介绍几种redis常见的实现延迟队列的方案。核心的代码实现:。
2024-05-20 09:57:11 115
转载 线上百万MQ消息积压的快速处理方案
针对线上MQ消息大量积压的问题,我们首先要做好消息积压到一定量之后做告警措施(如发短信或者邮件通知给负责人),然后排查和解决消费者问题(如修复消费者的bug或者消费者端消费的性能瓶颈问题),如果还存在大量的消息积压的问题,最后再采用新建临时topic的方式去快速消费积压的消息。由于MQ中有大量的消息积压,为此我们将消费者的代码做一些调整,即就是消费者不做实际的业务处理,而是将消息转发到临时的topic中(temp_topic),并且在临时的topic中增加是原来若干倍(如设置成原来的10倍)的分区。
2024-05-20 09:56:14 186
转载 TCP/IP协议族
tcp/ip协议族是一个四层协议系统。图1 TCP/IP体系结构数据链路层:实现网卡接口的网络驱动程序,处理数据在物理媒介(以太网、令牌环)上的传输。网络驱动程序屏蔽不同物理网络的电器特性。数据链路层使用ARP和RARP协议实现IP地址与MAC地址之间的相互转换(网络层使用IP地址寻址网络计算机,而数据链路层使用物理地址寻址网络中的计算机)。网络层:使用IP协议实现数据包在计算机网络、主机之间路由和转发,使用ICMP协议检测网络连接。
2024-05-20 09:54:54 95
转载 配置MySQL主从复制和读写分离
记住此处File和Position的值。的值替换成上述master上查询的值。经验证,已实现读写分离。创建数据库并添加数据。上授权数据库访问权限。上撤销数据库访问权限。
2024-05-16 10:35:54 23
转载 【深入学习MySQL】MySQL的索引结构为什么使用B+树?
最后,总结一下各种树解决的问题以及面临的新问题:1) 二叉查找树(BST):解决了排序的基本问题,但是由于无法保证平衡,可能退化为链表;2) 平衡二叉树(AVL):通过旋转解决了平衡的问题,但是旋转操作效率太低;3) 红黑树:通过舍弃严格的平衡和引入红黑节点,解决了AVL旋转效率过低的问题,但是在磁盘等场景下,树仍然太高,IO次数太多;4) B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题;
2024-05-06 15:13:04 28
转载 MySQL 上亿大表,如何深度优化?
select arrival_record 慢查询语句都类似于如下所示,where语句中的参数字段是一样的,传入的参数值不一样 select count(*) from arrival_record where product_id=26 and receive_time between '2019-03-25 14:00:00' and '2019-03-25 15:00:00' and receive_spend_ms>=0\G。
2024-05-06 15:12:15 25
转载 如何理解Mysql中的锁?
本文以一个线上问题为背景,对 Mysql 中的各种锁机制进行了详细的总结,分析了各个锁的加锁时机和具体使用场景,其中特别要注意间隙锁的使用,因间隙锁和间隙锁之间不互斥,当多个事务之间并发执行时很容易形成死锁asc。
2024-03-28 09:02:25 35
转载 mysql每天有1千万数据 怎么办?分表吗 有什么好的方案。?
分库是指在表数量不变的情况下对库进行切分。举例:如下图,数据库A 中存放了 user 和 order 两张表,将两张表切分到两个数据库中,user表放到 database A,order表放到 database B。两种方案的核心思想都是类似的,都是将分库分表的逻辑进行抽象封装,业务无需关注分库分表的实现细节,只需按照规则进行简单的配置和开发,就能正常的使用分库分表。两者各有优劣,客户端模式比较轻量,性能也会比较好;代理模式需要部署额外的服务器,所以对于该服务器的稳定性和性能等都需要保障。
2024-03-26 11:54:39 135
转载 玩转SQL执行顺序就是这么简单!
关键字包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等,它们共同构成了SQL查询的结构。SQL查询的总体执行顺序是按照FROM、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT/OFFSET的顺序进行。通过遵循正确的执行顺序,结合实际案例的代码示例,可以更好地理解和优化SQL查询,确保数据库操作的准确性和效率。这确保了查询从指定表中选择数据,经过适当的筛选和分组,最终以期望的形式呈现结果。(仅针对DQL语句)
2024-02-23 14:47:12 108 1
转载 SQL中碰到的坑之GROUP BY
在上面的例子中,employee_name列没有被包含在聚合函数中,也没有在GROUP BY子句中列出,导致返回的employee_name并非每个部门的最大工资对应的员工。要解决这个问题,确保SELECT语句中的列要么是聚合函数的结果,要么在GROUP BY子句中列出。在上面的例子中,实际上有两个坑,一个是坑一中所说的,另外由于SELECT语句中列的顺序与GROUP BY子句中的不同,导致结果与预期不一致。在GROUP BY子句中,列的顺序并不重要,但在SELECT语句中,列的顺序会影响结果的显示顺序。
2024-02-23 14:45:14 164
转载 8个必知必会的SQL小技巧!
通过条件聚合,你可以在聚合函数中使用条件语句。通用表格表达式(CTE)可用于更清晰、模块化地构建复杂的查询。使用PIVOT关键字,你可以将行数据转换为列。使用UNION操作符,你可以合并多个查询结果。使用联结是优化查询的重要手段之一。子查询可以嵌套在主查询中,增强查询的灵活性。不过,UNION慎用,它自带去重功能。在不需要去重时,可以考虑用UNION ALL。除了INNER JOIN,还有LEFT JOIN、FULL JOIN、后两个如何使用,可以查看下方链接哦。不过要慎用,影响查询性能。
2024-02-23 14:44:08 62
转载 基于 Nginx 实现一个灰度上线系统
新版本代码的上线基本都会用灰度系统,可以逐步放量的方式来保证上线过程不会出大问题,也可以用来做产品 AB 实验。我们可以用 nginx 实现这样的功能。nginx 有反向代理的功能,可以转发请求到应用服务器,也叫做网关层。我们可以在这一层根据 cookie 里的 version 字段来决定转发请求到哪个服务。在这之前,还需要按照比例来给流量染色,也就是返回不同的 cookie。不管灰度系统做的有多复杂,底层也就是流量染色、根据标记转发流量这两部分,我们完全可以自己实现一个。
2023-09-12 09:17:40 140
转载 一次非常有意思的 SQL 优化经历:从 30248.271s 到 0.001s
mysql嵌套子查询效率确实比较低可以将其优化成连接查询连接表时,可以先用where条件对表进行过滤,然后做表连接(虽然mysql会对连表语句做优化)建立合适的索引,必要时建立多列联合索引学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要。
2023-09-12 09:09:37 128
转载 10张图,完全掌握 MySQL 事务隔离级别
MySQL 的 InnoDB 引擎才支持事务,其中可重复读是默认的隔离级别。读未提交和串行化基本上是不需要考虑的隔离级别,前者不加锁限制,后者相当于单线程执行,效率太差。读提交解决了脏读问题,行锁解决了并发更新的问题。并且 MySQL 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。
2023-08-10 13:52:04 236
原创 使用PHP和Redis实现简单秒杀功能
在Redis中,可以使用List数据类型来存储秒杀活动信息。每个活动有一个唯一的键,值为一个字符串,包含活动的开始时间和结束时间。还可以使用另一个List来存储已经结束的活动信息,方便后续的处理。如果请求有效,则从Redis中扣除商品的库存,并将该请求信息存储到Redis中。在秒杀活动结束后,需要将该活动从活动中列表中移除,并将已经结束的活动的请求信息从Redis中删除。在PHP中,可以使用Redis扩展来连接Redis服务器。需要在PHP文件中包含Redis扩展,并创建一个Redis连接对象。
2023-08-04 11:17:29 1030
转载 如何从0到1构建一个稳定、高性能的 Redis 集群?(附16张图解)
好了,我们来总结一下,我们是如何一步步构建一个稳定、高性能的 Redis 集群的。首先,在使用最简单的单机版 Redis 时,我们发现当 Redis 故障宕机后,数据无法恢复的问题,因此我们想到了「数据持久化」,把内存中的数据也持久化到磁盘上一份,这样 Redis 重启后就可以从磁盘上快速恢复数据。在进行数据持久化时,我们又面临如何更高效地将数据持久化到磁盘的问题。之后我们发现 Redis 提供了 RDB 和 AOF 两种方案,分别对应了数据快照和实时的命令记录。
2023-07-19 15:44:00 148
转载 一文搞懂TCP、HTTP、Socket、Socket连接池
如果想要使传输的数据有意义,则必须使用到应用层协议比如Http、Mqtt、Dubbo等。基于TCP协议上自定义自己的应用层的协议需要解决的几个问题:心跳包格式的定义及处理报文头的定义,就是你发送数据的时候需要先发送报文头,报文里面能解析出你将要发送的数据长度你发送数据包的格式,是json的还是其他序列化的方式下面我们就一起来定义自己的协议,并编写服务的和客户端进行调用:定义报文头格式:length:000000000xxxx;xxxx代表数据的长度,总长度20,举例子不严谨。
2023-05-29 09:06:46 113
转载 SQL 优化 20 连问
一、查询SQL尽量不要使用select *,而是具体字段1、反例2、正例3、理由节省资源、减少网络开销。可能用到覆盖索引,减少回表,提高查询效率。
2023-05-04 15:56:39 77
转载 300 万数据导入导出优化方案,从 80s 优化到 8s
因为你所创建的book,Sheet,row,cell等在写入到Excel之前,都是存放在内存中的(这还没有算Excel的一些样式格式等等),可想而知,内存不溢出就有点不科学了!具体我没有看网上其他人的测试情况,这东西一般也很少有人愿意测试,不过这个速度对于我当时解决公司大数据的导入和导出已经足够,当然公司的业务逻辑很复杂,数据量也比较多,表的字段也比较多,导入和导出的速度会比现在测试的要慢一点,但是也在人类能接受的范围之内。在2003以前Excel的版本后缀还是.xls。它的优点是 不会报内存溢出。
2023-03-20 14:52:39 316
转载 面试官:从 MySQL 读取 100w 数据进行处理,应该怎么做?
分库分表场景下,单个表的查询结果集虽然不大,但如果某个查询跨了多个库多个表,又要做结果集的合并、排序等动作,依然有可能撑爆内存;当查询百万级的数据的时候,还可以使用游标方式进行数据查询处理,不仅可以节省内存的消耗,而且还不需要一次性取出所有数据,可以进行逐条处理或逐条取出部分批量处理。如果没有流式查询,我们想要从数据库取 100w 条记录而又没有足够的内存时,就不得不分页查询,而分页查询效率取决于表设计,如果设计的不好,就无法执行高效的分页查询。流式查询:内存会保持稳定,不会随着记录的增长而增长。
2023-03-20 14:51:24 196
转载 经典的 Shell 十三问
若从技术的细节来看,shell会依据IFS(Internal Field Seperator) 将command line所输入的文字拆解为"字段"(word/field)。当我们执行一个shell script时,其实是先产生一个sub-shell的子进程, 然后sub-shell再去产生命令行的子进程。环境变量只能从父进程到子进程单向传递。我们可用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案。我们可用 < 来改变读进的数据信道(stdin),使之从指定的档案读进。
2022-11-15 10:09:52 211
转载 消息队列经典十连问
1. 什么是消息队列你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下:我们通常说的消息队列,简称MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafka。2. 消息队列有哪些使用场景。有时候面试官会换个角度问你,为什么使用消息队列。你可以回答以下这几点: 应用解耦 流量削峰 异步处理
2022-03-18 14:42:13 112
转载 MySQL的主从
前言金三银四面试的时候,面试官经常会问MySQL主从。今天就跟大家聊聊MySQL的主从。 数据库主从概念、优点、用途 数据库主从复制原理 主主、主从、主备的区别 MySQL是怎么保证主从一致的 数据库主从延迟的原因与解决方案 聊聊数据库的高可用方案 1. 数据库主从概念、优点、用途主从数据库是什么意思呢,主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。数据库为什么需要主从架构呢? 高可用,实
2022-03-15 09:24:06 18763 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人