- 博客(181)
- 资源 (24)
- 问答 (1)
- 收藏
- 关注
原创 某次活动优惠券故障复盘及优化建议
通过以上优化措施和建议,能够进一步提升系统的稳定性和性能,减少因缓存和数据库问题导致的系统故障,提高用户体验和业务连续性。希望这篇技术文章能够帮助团队在未来避免类似的故障发生,为系统的稳定运行提供保障。在2024年7月19日19:41,系统出现了“系统繁忙,稍后再试”的错误提示,数据库CPU达到100%,接口响应超时。
2024-08-03 00:22:24
754
原创 深入理解 Redis 批量操作和事务机制:从原理到 Spring Data Redis 实践
Bean// 配置其他必要的属性,例如序列化器在 Spring Data Redis 中使用批量操作和事务时,必须了解 Redis 事务的局限性,特别是没有自动回滚机制。在高并发场景下,使用 Lettuce 作为 Redis 客户端,可以更高效地执行批量操作,避免单线程瓶颈。通过正确配置和使用 RedisTemplate,可以高效地执行 Redis 操作,并确保数据的一致性和性能。希望这篇文章能帮助你更好地理解和使用 Redis 的批量操作和事务,提高系统的性能和稳定性。
2024-07-30 00:10:59
1031
原创 数据导出过大导致内存占满及探活失败问题的排查分析及解决方案
在微服务架构中,Kubernetes 使用 Liveness Probe 来监控应用程序的健康状态,并在探测失败时重启容器。当应用程序在处理大规模数据导出时,例如导出 600 万条记录到内存中,容易导致内存占满。这不仅会引发性能问题,还可能导致 Liveness Probe 失败,从而使 Kubernetes 重启容器,影响服务的稳定性。本文将详细分析数据导出过大导致的内存占满及探活失败问题,并提供详细的排查和解决方案。通过使用方法进行流式写入,可以有效避免大数据集导出时的内存占满问题。
2024-07-28 22:45:06
481
原创 MyBatis 返回行数的技术指南:避免常见陷阱
在使用 MyBatis 进行数据库操作时,很多开发者会依赖返回的行数来判断操作是否成功。然而,默认配置下,MySQL 数据库返回的行数可能会导致一些误判。这篇文章将详细探讨 MyBatis 返回行数的原理、常见问题及如何通过配置来避免这些陷阱,从而确保应用程序的可靠性和准确性。此外,我们还将介绍在无法配置的情况下,其他可行的解决方案。尽管配置手动校验数据的变化:适合数据变化不频繁的场景。使用触发器:在数据库层记录变化,适合需要详细记录数据变化的场景。乐观锁。
2024-07-21 23:57:14
539
原创 如何在 Nacos 中实现弱依赖健康检查
通过禁用 Spring Actuator 对 Nacos 的健康检查,可以在 Nacos Server 短暂不可用时,依然使用缓存的旧服务列表,保证服务的连续性。这种配置可以有效减少因 Nacos Server 不可用导致的服务中断,提高系统的高可用性。同时,通过合理的监控和优化,可以进一步提升系统的性能和稳定性。通过以上步骤,您可以实现对 Nacos 的弱依赖,提高整个微服务系统的健壮性和可靠性。
2024-07-21 22:27:36
921
原创 深入分析和优化MySQL主从复制延迟的技术指南
主从复制延迟是高并发和大数据量环境中的常见问题。通过优化查询性能、调整数据库配置、使用在线DDL工具、硬件优化、分布式数据库、实时监控和分区表等措施,可以有效减少复制延迟,提高数据库系统的整体性能。理解主从复制的底层原理,针对性地进行优化,将有助于在最小化影响的情况下完成表结构变更,提高系统的可靠性和可用性。持续监控和优化数据库配置,是保持高性能数据库系统的关键。
2024-07-19 14:57:47
571
原创 探索 TransactionSynchronizationManager.afterCommit 的原理及使用
是 Spring 框架提供的一个用于管理事务同步的工具类。它允许你在事务的不同阶段注册回调,例如在事务提交前后、事务回滚前后等。其中,方法用于在事务成功提交后执行特定的操作。是一个强大的工具,用于在事务提交后执行回调操作。通过理解其工作原理和使用方法,你可以在事务成功提交后执行所需的操作,如记录日志、发送通知等。需要注意的是,依赖于事务上下文,因此在使用时要确保事务正确配置,并根据需求选择合适的事务传播行为。
2024-07-17 23:15:14
825
原创 Redis 框架 jedis 与 lettuce 比较
jedis 使用了线程池来解决 mget 的问题,具体查看类:org.springframework.data.redis.connection.jedis.JedisClusterStringCommands。对于单个 get 请求来说,对比第4个和第5个用例,对比第7个和第8个用例,jedis 性能与 lettuce 框架性能相当,差别不大。对于 mget 批量请求来说,对比第1个和第3个用例,lettuce 性能明显好于 jedis 框架。serviceA 1台。serviceB 1台。
2024-07-14 22:56:37
556
原创 Redis无感升级配置
1、接入各种中间件之前,必须对其进行高可用的调研及压测,在宕机场景下也能尽快恢复。2、线上操作各种中间件之前,最好能在测试环境进行预演。
2024-07-14 22:17:29
301
原创 Spring事件监听机制详解
Spring事件监听机制是一种基于观察者模式的设计,通过发布和监听事件,使得不同组件可以解耦地进行交互。事件类 (:封装需要传递的信息。事件发布者 (:负责发布事件。事件监听器 (:监听并处理事件。Spring事件监听机制通过和实现了组件之间的松耦合,增强了系统的灵活性和可扩展性。通过发布和监听事件,可以实现更高效、更模块化的应用设计。这一机制广泛应用于各种场景,如用户注册、订单处理、日志记录等。希望通过本文的介绍,大家能够更好地理解和应用Spring事件监听机制,为项目设计带来更多的便利和灵活性。
2024-07-13 23:22:33
558
原创 Redis 布隆过滤器性能对比分析
特点:对于某个bit 设置0或1,对于大量的值需要存储,非常节省空间,查询速度极快,但是不能查询整个key所有的bit,在一次请求有大量的值需要过滤的场景会出现多次请求getbit,性能会急剧下降,需要把多个gitbit合并成批次,使用lua脚本或者pipeline执行提高效率。特点:redis 4.0 以上官方提供的一个插件,原生Bloom过滤器,参数包括 布隆过滤器的大小,误差率等,支持批量写入和批量查询,性能更优,针对一次大量请求,批量查询接口性能更快。
2024-07-11 23:20:19
436
原创 自定义业务非受检异常
在重构方法时,如果原来方法未抛出异常,你去重构时,需要抛出异常时,需要改造的地方比较多,特别是链路很长的时候。此时,就需要抛出 java.lang.RuntimeException 该类型的非受检异常。在原有的 BusinessException 基础之上,新建一个 BusinessRuntimeException 非受检异常(继承:java.lang.RuntimeException)。非受检异常:当你不需要调用者关心时,抛出该类型异常。受检异常:当你需要强制调用者对异常异常进行处理时,抛出该类型异常。
2024-07-10 22:37:39
183
原创 Canal架构以及使用规范
Message getWithoutAck(int batchSize),允许指定 batchSize,一次可以获取多条,每次返回的对象为 Message,包含的内容为:batch id[唯一标识]和 entries[具体的数据对象]void rollback(long batchId),顾名思义,回滚上次的 get 请求,重新获取数据。EventStore 实现模式是内存模式,内存结构为环形队列,由三个指针(Put、Get 和 Ack)标识数据存储和读取的位置。instance 下的子模块。
2024-07-07 22:37:45
1000
原创 nacos 不进行健康检查
原因是健康探测接口:/api/status/ready 会去探测 nacos server 的健康状态,如果不健康,则把 pod 下线。作为一个服务注册中心,为了保证高可用应该使用 AP 模式(即数据可以短暂不一致,以保证其高可用),而 nacos 本身也支持 AP 模式。当 nacos server 不可用时,nacos client 自带的缓存保存的还是旧服务列表,依然可以保证服务正常调用。然后,健康探测也是 UP 的,不会引起 k8s 探测,引起下线。1)我把我本地的服务启动。
2024-05-30 18:39:20
374
原创 Arthas使用教程
arthas对原本进程的影响,本质上arthas对进程的影响是很小的,但是对于一些命令的执行我们要额外关注下,比如trace的时候尽量不要一次性监听多个类。其中每个方法前面的百分号是这个方法执行耗时占了整个链路的百分比,后面是相关具体耗时,可以看到上图中setPreAndAvailNum耗时是比较久的,占用了6ms多,由于arthas无法动态监听下一级方法(新版本已经提供,但是感觉效果一般,具体可以查看相关文档),所以需要我们手动添加该方法的监听命令。其它的使用可以参考文档中的相关参数。
2024-03-04 18:22:19
1078
原创 服务内存优化思路
通过分析最终定位到是 org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator#health 这个方法引起的,这里有返回了 services 的信息。其中 java.lang.Thread 有 2000 多个,org.apache.dubbo.common.threadlocal.InternalThread 线程居然有 6000 多个。关闭心跳探测时,对服务列表的返回。
2024-02-23 18:57:28
366
原创 如何查看 CPU 占用高的进程
2.2 启动命令:java -jar arthas-boot.jar 注释:k8s 的 java 进程的 pid 都是 1,因此直接运行 java -jar arthas-boot.jar 1。2、查看哪个进程占用 cpu 最高(该案例使用阿里的 arthas 来查看)查到是 SkyWalking 的 agent 进程占用太大。1、使用 top 命令,查看 cpu 占用超过 100%2.1 下载:curl -O。
2024-02-20 11:09:50
656
原创 蒙住了双眼,难受啊!log jar包冲突,导致无日志,神器救场
logjar包冲突了,实际使用了ch.qos.logback.classic.util.ContextSelectorStaticBinder,正确的应该是使用log4j,导致无日志打印。一检查日志是否输出到文件,因为SLS是读取日志文件的;所以马上到K8S容器看看是否输出到日志文件,发现没有日志文件,说明日志没有输出到日志文件。日志好比我们的眼睛,没有日志==被蒙住了双眼,发生啥都不知道了。今天上阿里的日志服务(SLS)查看某个服务的日志,发现竟没有日志。因此本地启动项目排查。......
2022-07-25 18:03:58
1267
1
原创 销量最优解
目录业务背景优化方案初版(优化大多不能一步到位,请看到最后)优化方案升级版微信公众号:molashaonian业务背景商品列表等场景需要展示商品销量,销量自然就跟订单关联,那么统计销量就需要统计商品订单销售的sku 数量痛点:目前销量计算以 spu(商品) 维度,通过JOB定时查询订单商品表进行统计,以及更新销量缓存,对数据库表的全量查询消耗过大优化方案初版(优化大多不能一步到位,请看到最后)从计算入手。目前问题也知道了,全量查询计算消耗大,那就从计算销量入手。spu首次全量计
2022-05-16 15:25:30
264
1
原创 缓存击穿,双缓存处理策略
对于热点 key 可以设置一级,二级缓存二级缓存可以设置较长的过期时间(甚至不过期),当一级缓存过期时,加锁从数据库中获取最新值,并且更新一级,二级缓存;同时没获得锁的线程直接读取二级缓存返回。
2022-03-07 11:47:54
785
原创 MySQL慢查询优化思想总结
微信公众号:molashaonian1.慢查一索引情况 PRIMARY KEY (id), INDEX idx_status_ct(status, created_time) 优化前SELECT*FROMropWHERE`status`IN(0,3)ANDis_delete=0LIMIT112000,1000显然,这条SQL之所以慢是因为分页查询,到后面需要跳过的数据太多了,而且 status 状态的区分的也不是很高,所以越往后查询就越慢...
2020-08-02 15:25:19
328
原创 MySQL只走一个索引,还是会索引合并?索引下推会怎样?
微信公众号:molashaonianMySQL是否每次只能使用一个索引?答案当然不是的,MySQL每次可以使用多个索引,即 index merge(索引合并),但大多数情况下都只会使用一个索引,那这是为什么咧?1. 为什么会有index mergeMySQL5.0之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引分别进行条件扫描 我们的 where 中可能有多个条件(或者join.
2020-08-01 19:14:32
3582
原创 Jedis 在 Java7 之后无需手动调用 close 释放连接 try-with-resources 内幕
微信公众号:molashaonianJedis 用完是否需要手动 close?一般情况下,我们在使用完连接资源后都要 close 关闭连接,释放资源。这么常用的方法,基于习惯,Java 在 jdk1.7 之后为我们提供了一个很好的方法try-with-resources Statement ,我们不再需要手动调用 close 方法,也可以释放连接。此处以 Jedis 为例子,说下该...
2019-04-08 16:31:31
7776
原创 两个时间段是否有交集 + 数据库时间类型选择问题
1.判断两个时间段是否有交集两个时间段:[start,end],[startTime,endTime]存在交集的情况比较多,但是不存在交集的情况只有两种,所以只要排除了不存在交集的情况,剩下的就是存在交集的情况了。不存在交集判断end < startTime || start > endTime因此,存在交集判断if (!(end < startTime || s...
2019-04-01 16:24:35
2316
原创 MongoDB 之 aggregate $lookup 关联查询 进阶篇
需求:要对 topics 问题表根据 teach_id(教师ID),tips._id(问题标签ID) 字段进行分组统计教师的答题情况生成报表,所以得根据 教师ID,标签ID 关联查询出 教师信息,标签信息 用作报表展示。本文基于 MongoDB V3.2 聚合查询语法,V3.6 可使用更多的特性实现topics 表数据结构:{ "_id" : "ffffea46-ab7d-4c1...
2019-01-20 16:28:59
19251
2
原创 MySQL -- INSERT ON DUPLICATE KEY UPDATE 使用
前言: MySQL 中 INSERT ON DUPLICATE KEY UPDATE 这个方法可能不是很常用,但却很好用,它主要功能是:当插入的数据中的主键 与 数据库中现有的数据主键 重复的情况下就不会执行插入操作,而是可以对现有的数据进行更新操作,不存在相同主键则执行插入操作。下面来说说,我为什么会需要这样的操作:假设有表 A,B,C,他们的主键分别是 a-pk,b-pk,c-pk...
2019-01-06 13:06:32
5454
2
原创 Git 命令使用笔记
小白篇: Git新手上路,让你快速掌握Git的基本使用#添加电脑ssh密钥到git:C:\Users\evan\.ssh\id_rsa.pub -- 复制 --->> git 个人资料设置--SSH密钥--公钥 输入复制内容 #拉取远程仓库项目git clone git@github.com:molashaonian/git_command.git#初始化当前目录g...
2018-12-19 11:05:32
258
原创 MySQL索引优化 & 聚簇索引 & 字段选择性 & 范围查询 & 组合索引的字段顺序
索引B-Tree:一般来说, MySQL 中的 B-Tree 索引的物理文件大多都是以 B+tree的结构来存储的,也就是所有实际需要的数据都存放于 Tree 的 Leaf Node,而且到任何一个 Leaf Node 的最短路径的长度都是完全相同的,可能各种数据库(或 MySQL 的各种存储引擎)在存放自己的 B-Tree 索引的时候会对存储结构稍作改造。如 Innodb 存储引擎的 B-T...
2018-10-11 16:30:41
6244
1
原创 分布式锁--Redis小试牛刀
参考文章:Redis分布式锁的正确实现方式分布式锁看这篇就够了在这两篇文章的指引下亲测 Redis分布式锁引言分布式系统一定会存在CAP权衡问题,所以才会出现分布式锁什么是CAP理论? 为了更好的理解文章,建议阅读:分布式系统的CAP理论什么是锁?在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这...
2018-08-09 15:56:07
351
转载 一致性哈希算法及其在分布式系统中的应用
from:http://blog.codinglabs.org/articles/consistent-hashing.html摘要本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一...
2018-08-05 21:38:40
303
原创 MongoDB 聚合嵌入的数组(扁平化数据+管道)
MongoDB学习教程先看下要操作的主要数据结构:{ "_id" : "000015e0-3e9c-40b3-bd0d-6e7949f455c0", "evaluation_type" : 2, "reply_count" : 5, "type" : 3, "content" : "怎么编制余额调节表", "ti
2018-06-24 13:44:39
6336
原创 Spring Boot 源码分析 数据源 + Mybatis 配置
公司今年开始使用 Spring Boot 开发,当然使用 Spring Boot 也是大势所趋,尤其是现在微服务的趋向,当然是选择基于Spring Boot 的 Spring Cloud。(所谓的 Spring 全家桶,哈哈哈)一日,闲来无事,都说 Spring Boot 习惯优于配置,但是这习惯它到底在哪里配置实现了。好奇心的驱使下,我偷偷翻看了 Spring Boot 下 数据源和My...
2018-06-18 22:13:33
680
1
原创 绝对完全跨域统一单点登录登出
应用场景:多个系统下同属于一个用户,当用户登录了web1系统,那么访问web2,web3. . . . 时候,用户就无需再次登录。如:淘宝与天猫,登出也如此,一个系统登出,其他系统的登录也随之失效,这就是统一单点登录登出。这里配置三个web系统,一个用户中心系统为栗子配置hosts实现跨域:127.0.0.1 ssofront.ljtest.xxxx.com #用户中心127.0...
2018-05-06 16:38:17
14194
13
转载 Java与groovy混编 —— 一种兼顾接口清晰和实现敏捷的开发方式
有大量平均水平左右的“工人”可被选择、参与进来 —— 这意味着好招人有成熟的、大量的程序库可供选择 —— 这意味着大多数项目都是既有程序库的拼装,标准化程度高而定制化场景少开发工具、测试工具、问题排查工具完善,成熟 —— 基本上没有团队愿意在时间紧、任务重的项目情况下去做没有把握的、基础开发工具类的技术试探有面向对象特性, 适合大型项目开发 —— 无数大型项目已向世人述说,“面向对象”是开发大型软...
2018-03-22 10:55:42
2442
原创 Java 调用 groovy 脚本文件,groovy 访问 MongoDB
groovy 访问 MongoDB 示例:shell.groovypackage dbimport com.gmongo.GMongoClientimport com.mongodb.BasicDBObjectimport com.mongodb.MongoCredentialimport com.mongodb.ServerAddress/** * 本地无密 mongodb 数据...
2018-03-06 11:27:47
1267
转载 消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer,保证线程安全
按照官网提供的订阅型写法( Retrieving Messages By Subscription ("push API")) 我发现,RabbitMQ服务器会在短时间内发送大量的消息给Consumer,然后,如果你没有来得及Ack的话,那么服务端会积压大量的UnAcked消息,而Consumer如果来不急处理也会处于假死(也可能引起程序崩溃)。仅有两个Channel,结果积压了大量的UnAcke...
2018-03-01 10:57:54
3514
1
原创 MongoDB 之 aggregate $group 巧妙运用
有这样一组数据:{ "campaign_id": "A", "campaign_name": "A", "subscriber_id": "123"},{ "campaign_id": "A", "campaign_name": "A", "s
2018-02-28 17:30:46
14441
Android怎样上传音频到服务器
2016-04-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人