- 博客(78)
- 资源 (1)
- 收藏
- 关注
原创 电商项目_性能优化_海量数据读写、存储、检索
无论任何业务系统,无非就是两个操作:写和读。在海量数据和高并发的场景下,写和读就会成为系统性能的瓶颈。场景1:广告扣费系统。广告通常要么按浏览付费,要么按点击付费(业界叫作 CPC或 CPM)。具体来说,就是广告主在广告平台开通一个账号,充一笔钱进去,然后投放自己的广告。C端用户看到了这个广告后,可能点击一次扣一块钱(CPC);或者浏览这个广告,浏览1000次扣10块(CPM)。扣款要尽可能实时,如果慢扣了, 就可能造成广告主没有钱了,但是广告仍在播放。
2025-08-03 23:15:29
337
原创 电商项目_性能优化_数据同步
大促等场景,并发请求数量的基数过大,即便只有很小比率的请求直接访问数据库其绝对数量也仍然不小,还是会存在系统雪崩的风险。构建Redis集群后,由于集群可以水平扩容,因此只要集群足够大,理论上支持海量并发就不是问题。所以可将将Redis当做数据库使用,将所有数据都缓存到Redis。解决缓存不命中的问题。在缓存一致性章节讲到过,为了保证DB和缓存的数据一致性,DB变更时,需要删除Redis缓存。思考:Redis缓存了这么多的DB数据,如何保证数据一致性呢?1. 分布式事务保证DB和缓存一致性。
2025-08-01 22:51:47
947
原创 电商项目_性能优化_高并发缓存一致性
如果说要对你的项目进行优化,最先想到的就是使用缓存。说到缓存,最先想到Redis, 可是缓存可不仅仅只有Redis。缓存有哪些类型?如果保存缓存一致性?是本文要回答的问题。
2025-07-31 23:48:17
840
1
原创 电商项目_核心业务_分布式事务
在微服务架构中,完成某一个业务功能可能需要横跨多个服务,操作多个数据库。这就涉及到到了分布式事务。需要操作的资源位于多个资源服务器上,而应用需要保证对于多个资源服务器的数据操作,要么全部成功,要么全部失败。本质上来说,2PC(二阶段提交)TCC可靠消息(MQ)基于 Seata AT 实现。
2025-07-30 16:24:28
1034
原创 电商项目_核心业务_支付
支付实际上是一个风险非常大的业务,真正能够自主开发第三方支付产品的企业非常少。因此大部分企业都需要接入第三方支付产品,通过他们形成自己的支付能力。比较有名的第三方支付产品有支付宝、云闪付、和包支付、翼支付等。支付宝提供了两个重要的服务开放平台,对外开放自己的核心支付能力。第三方企业都可以通过这两个服务开放平台接入支付宝,借助支付宝开发自己的支付场景。2. 开发者登录支付宝开放平台后,进入控制台,需要在控制台创建对应的应用appId.还有各种产品签约流程。下面以支付宝为例,描述接入支付产品的大致流程。
2025-07-28 00:23:04
366
原创 电商项目_核心业务_数据归档
4. ⼤批量删除数据,还要注意下,执⾏删除语句后,最好能停顿⼀⼩会,因为删除后肯定会牵涉到⼤量的B+树⻚⾯分裂和合并,这个时候MySQL的本身的负载就不⼩了,停顿⼀⼩会,可以让MySQL的负载更加均衡。以Mysql存储的订单数据为例,随着业务的发展,数据量越来越大,对一些历史归档数据的查询,如果直接从DB查询就不太合适,比如"2021年订单"等等。由于B+树的有序性,这些ID相近的记录,在磁盘的物理⽂件上,⼤致也是存放在⼀起的,这样删除效率会⽐较⾼,也便于MySQL回收⻚。2. 将数据写入新的存储系统。
2025-07-27 23:36:22
411
原创 电商项目_核心业务_分布式ID服务
第 42~52 位 :一共 10 位,一般来说,前 5 位表示机房 ID,后 5 位表示机器 ID(实际项目中可以根据实际情况调整),这样就可以区分不同集群/机房的节点,这样就可以表示 32 个 IDC,每个 IDC 下可以有32 台机器。如果是订单号,竞对可以直接知道我们一天的单量。在实际项目中,我们一般也会对 Snowflake 算法进行改造,最常见的就是在算法生成的 ID 中加入业务类型信息。以服务的方式部署(可以不依赖数据库等第三方系统),稳定性更高,生成 ID 的性能也非常高的。
2025-07-27 12:56:19
889
原创 电商项目_核心业务_促销
促销活动并不是电商系统的核心业务,但是各个电商系统一般都有促销活动,而且形式多种多样。因此,在设计促销系统时,最为核心的关注点是要如何在尽量少的影响主体业务的前提下,尽可能保持促销规则的灵活性。优惠券code字段: 用户领取优惠券时, 针对用户领取优惠券记录,可以生成个coupon_code字段,在有些促销场景下,这个code就很有用。比如小米的F码,输入用户领取优惠券时生成的coupon_code, 就可以购买指定的商品并使用优惠啦。3. 查询用户可领券的优惠券。2. 用户领取优惠券。
2025-07-26 22:56:46
194
原创 电商项目_秒杀_架构升级
所以考虑将增加redis从节点个数。秒杀系统为提交读库存的性能,将redis从节点和nginx节点部署在一起的, 如果升级成redis集群, nginx读哪个从节点呢?-》考虑将nginx也水平扩展。(nginx可以扩容原因:商品详情页的静态页面发布到OpenResty上, 那么就可以考虑将不同商品的页面发布到不同的openResty上)
2025-07-24 23:39:26
901
原创 电商项目_秒杀_高保障
⿊产⽤户总能想出五花⼋⻔的抢购⽅式,有借助物理⼯具,像“⾦⼿指”这种帮忙点击⼿机抢购按钮的;有通过第三⽅软件,按时准点帮忙触发App内的抢购按钮的;还有的是通过抓取并分析抢购的相关接⼝,然后⾃⼰通过程序来模拟抢购过程的。针对第一种,在风控时做处理。针对第二种:Token机制, 让接口直接保持依赖关系,从而限制黑产直接调用接口。header_filter_by_lua_block : 响应头部或cookie处理。
2025-07-23 18:50:31
374
原创 电商项目_秒杀_架构及核心
先看下普通web项目架构: (Nginx : 反向代理、负载均衡,一般是运维部分做生产搭建的时候配置好)秒杀架构设计:和普通架构区别:核⼼设计是对巨⼤的瞬间流量进⾏层层错峰。错峰1:页面静态化。将包含浏览者信息的动态数据和不包含的静态数据进行区分。错峰2:秒杀前答题。⽬的是防⽌机器刷单,以及错开⽤户的下单时⻓。错峰3:Redis扣减库存。快速扣减库存, 扣减库存完通知nginx.错峰4:Nginx快速通知秒杀结束。错峰5:MQ进行流量消峰错峰6:引⼊ MQ 进⾏下单服务异步化—场完整的秒杀活动的⼤概流程是这
2025-07-23 00:09:56
822
原创 RocketMq高性能架构设计
分布式架构中,消息中间件要实现三高:高性能、高扩展、高可用特性。RocketMq是怎么实现的呢从RocketMq实现的功能上分析,能够实现高性能的点体现在几个方面:1. Producer尽快的发消息2. Consumer尽快的消费消息3. Broker能保存海量消息,保证消息的不丢失。
2025-07-21 08:38:54
413
原创 MQ核心问题
这里的顺序指的是局部有序,而不是全局有序。局部有序指的是一个业务场景下,保证他的消息发送和消费是有序的。RocketMq客户端的实现参考RocketMq客户端编程模型-CSDN博客。
2025-07-19 00:29:29
904
原创 RocketMq集群高可用
从上面章节可以了解到,RocketMq集群有两种模式,一种是主从节点固定身份的模式,一种是可以自主选择主节点的Dledger集群。那么Dledger集群是如何实现通信?如何实现自主选择主节点,实现高可用的呢?
2025-07-17 23:36:21
1056
原创 RocketMq Netty服务注册_源码分析
RocketMQ实际上是一个复杂的分布式系统, NameServer,Broker,Client之间需要有大量跨进程的RPC调用。这些复杂的RPC请求是怎么管理,怎么调用的呢?RocketMQ整个服务的。所以这部分源码的学习对了解RocketMq的运行机制至关重要。Netty的所有远程通信功能都由实现。remoting模块中有两个对象最为重要。就是RPC的服务端RemotingServer以及客户端RemotingClient。建立的连接是长连接: 双方都可以主动发起会话。
2025-07-17 00:24:13
132
原创 RocketMq部署模式简介
RocketMq与其他MQ产品比较:RocketMq简介:RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。,现在是Apache的一个顶级项目。
2025-07-14 19:27:43
415
原创 Redis专题总结
2. 秒杀场景, Redis保存了库存量。Redis扣库存,异步扣减DB,如果调用Redis失败,如何处理?Redis失败分为两种情况:1 扣减成功但是超时 2.Redis扣减失败,分别怎么处理?1. 哨兵机制和集群模式, 在Master宕机选举出新的master之间有一定的时间延迟,这部分时间如果有写入请求, 会写入成功吗?会导致中从节点数据不一致吗?3. 热点key重建 tryAcquire() (待复习)4. redis在java中的使用 (待复习)
2025-07-12 23:05:02
429
原创 Redis底层数据结构
通过添加的这些参数,可以更方便解析字符串。例如,如果用数组方式保存字符串,那么读取完整字符串就只能遍历数组里的各个字节数据,时间复杂度O(N)。但是SDS中预先记录了len后,就可以直接读取一定长度的字节,时间复杂度O(1),效率更高。另外,C语言中通常用字节数组保存字符串,那么还需要定义一个特殊的结束符\0表示这一个字符串结束。但是在Redis中,如果value中就包含\0这样的字符串,就会产生歧义。根据不同的键值,选择不同的编码方式(不同的底层数据结构), int | embstr | raw。
2025-07-11 08:31:08
1339
原创 Redis Stack扩展功能
RedisJSON是Redis的一个扩展模块,它提供了对JSON数据的原生支持。常用操作:Redis JSON优势: 当Redis中存储的数据比较多时,搜索Redis中的数据是一件比较麻烦的事情。通常使用的 keys * 这样令,在生产环境一般都是直接禁用的,因为这样会产生严重的线程阻塞,影响其他的读写操作。 如何快速搜索Redis中的数据(主要是key)呢? Redis中Search And Query模块。Scan指令的官方介绍:https://redis.io/docs/l
2025-07-10 12:48:20
852
原创 Redis缓存
拒绝bigkey(防止网卡流量、慢查询)在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储大约40亿个(2^32-1)个元素,但实际中如果下面两种情况,我就会认为它是bigkey。字符串类型:它的big体现在单个value值很大,一般认为超过10KB就是bigkey。非字符串类型:哈希、列表、集合、有序集合,它们的big体现在元素个数太多。
2025-07-10 09:14:24
631
原创 Redis实现分布式锁
借用Redis消息机制,释放锁时发消息, 等待获取锁的逻辑中监听这个锁释放的消息, 监听到消息后,去重新获取锁。主线程开启一个子线程,在子线程中检查主线程是否还占有锁,如果有的话,给他延长过期时间。5. 业务执行完成锁还未过期,如何快速通知等待锁的线程去获取锁?3. 设置过期时间(设置值和过期时间,保证原子性)4. 业务还未执行完,锁已经过期了怎么办?6. 等待锁的线程,等待逻辑是怎样的?1. setnx 获取锁 (原子性)2. 业务逻辑执行完成保证锁能释放。
2025-07-08 00:22:02
178
原创 Redis架构安全
注意:slave节点并不是在master节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,确保mater FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票.默认情况下,从库是只读的,不允许写入数据。<4>如果旧的master恢复了,Sentinel Leader会让旧的master降级为slave,并从新的master上同步数据,恢复工作。<2>Sentinel会在剩余健康的Slave节点中选举出一个节点作为新的Master。
2025-07-07 15:34:20
1053
原创 Redis线程模型
Redis目前支持一些复杂的数据结构,可以应用到多种业务场景;Redis数据保存在内存,但是持久化到磁盘,意味着Redis的可以保证数据安全,特定的场景也可以当做数据库来使用;
2025-07-06 16:41:18
823
原创 Mysql专题复习
6. InnoDB底层原理:undo日志、redo log buffer、redo log、binlog、Buffer pool、数据磁盘文件(.idb)2. update操作,更新条件是非索引字段,行锁可能会变表锁。7. msyql8 新特性:降序索引、group by不排序、函数式索引、隐藏索引、索引跳跃扫描等等。1. 数据库隔离级别实现方式, 锁、隔离级别、MVCC, 之间的关系, 还是没有理清楚。4. 索引优化:覆盖索引、排序、JOIN、分页;3. RR级别会升级为表锁,RC级别不会升级为表锁。
2025-07-06 00:28:39
143
原创 Mysql8.0新特性
使用场景:线上已有表且数据量很大,如果觉得某个索引没用了,删除索引后发现还有业务场景需要用到这个索引,则还需要把索引加回来,非常的麻烦。为什么要专门讲Mysql8.0的新特性呢, 因为之前对Mysql固有的认知,在Mysql8.0中的实现方式不一样,所以还是有必要了解下这其中的差别。实现,在MySQL中相当于新增了一个列,这个列会根据你的函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引。但是我们不能以来这个优化,建立索引的时候,还是有限吧区分度高的,查询频繁的字段放到联合索引的左边。
2025-07-03 23:40:15
941
原创 Mysql事务与锁
数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。为了解决这些并发事务的问题,数据库设计了隔离机制,用一整套机制来解决多事务并发问题。
2025-07-01 23:19:52
890
原创 Mysql索引优化
1., 查询语句只使用,是否走索引?不会,mysql内部可能认为第一个字段就使用索引,查询的范围比较大,回表效率不高,不如全表扫描。在表数据量比较大的情况下走索引,在表记录数不多的情况下全表扫描3. like 'KK%' 一般情况走索引:msyql将其当成个常量处理。有可能使用到下推索引。为什么范围查询没有用到下推索引?估计mysql认为范围查询的过滤结果集比过大,like 'KK%'在绝大多数情况,过滤后的结果集比较小。
2025-06-30 23:57:25
717
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人