摘要: 接口优化过程记录 问题背景 某个接口耗时长(247ms),但里面逻辑不算复杂,只进行了简单的对象引用以及操作了多次Redis 步骤1:链路追踪,确定业务耗时点 接口里通过链路追踪以及日志查询发现主要是操作Redis的这条链路耗时变长 步骤2:从Redis找问题,列出可能点 原因可能是: Redis本 阅读全文
posted @ 2022-12-06 15:21 simonlee_java 阅读(539) 评论(0) 推荐(1) 编辑
摘要: title : webflux延迟队列逻辑更改过程记录 author : simonLee date : 2022/11/22 10:26 webflux延迟队列逻辑更改过程记录 一、问题背景 一个业务使用了webflux.delayElement(Duration delay)来发送延迟消息,由于 阅读全文
posted @ 2022-12-06 15:14 simonlee_java 阅读(225) 评论(0) 推荐(0) 编辑
摘要: Redis锁的使用 起因:分布式环境下需对并发进行逻辑一致性控制 架构:springboot2、Redis IDEA实操 先新建RedisLock组件 注:释放锁使用lua脚本保持原子性 @Component @Slf4j public class RedisLock { private final 阅读全文
posted @ 2022-12-06 15:08 simonlee_java 阅读(18) 评论(0) 推荐(0) 编辑
摘要: MongoDB海量数据分页查询优化 一、背景 大量数据需从Mongo拿出来,一次性拿出来不科学,传统分页效率低下 二、传统方案 就是最常规的方案,假设 我们需要对文章 articles 这个表(集合) 进行分页展示,一般前端会需要传递两个参数: – 页码(当前是第几页) – 页大小(每页展示的数据个 阅读全文
posted @ 2022-12-06 15:04 simonlee_java 阅读(2123) 评论(0) 推荐(0) 编辑
摘要: Springboot配置多Redis源 一、背景 因项目部署了新集群,某些缓存数据需要在旧的redis上取,就必须配置多个数据源动态获取相对应的源以兼容业务。 二、配置依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId> 阅读全文
posted @ 2022-12-06 14:57 simonlee_java 阅读(1297) 评论(0) 推荐(0) 编辑
摘要: 同步锁实现 一、背景 在并发场景下,需要单一线程或限定并发数操作某些逻辑,这时候就需要用到一个锁来保证线程安全。 二、思路 使用ConcurrentHashMap实现,但只支持同一个jvm下的线程(暂时满足) 使用Semaphore信号量作为锁 数量操作都使用java原子操作类,例:AtomicIn 阅读全文
posted @ 2022-12-06 14:53 simonlee_java 阅读(25) 评论(0) 推荐(0) 编辑
摘要: Springboot优雅进行字段检验 1、Controller VS Service 推荐与业务无关的放在controller层中进行校验,而与业务相关的放在service层中校验。 2、常用校验工具类 使用Hibernate Validate 引入依赖 <dependency> <groupId> 阅读全文
posted @ 2022-12-06 14:49 simonlee_java 阅读(59) 评论(0) 推荐(0) 编辑
摘要: Map的常用方法 案例1 场景:一张建行用户体验金信息大表(百万级别),里面存在一个字段对多条数据,需要统计某个字段的多条数据累加值以供于别的服务调用。 优化前解决:直接查出来一个大list给到另一个服务,再另外一个服务里有笛卡尔积算出累加值(笛卡尔积后得到jvm需运算56亿次),程序直接接近崩溃, 阅读全文
posted @ 2022-12-06 14:46 simonlee_java 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 踩坑记录:Redis的lettuce连接池不生效 一、lettuce客户端 lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例操作,是线程不安全的), 阅读全文
posted @ 2022-12-06 14:44 simonlee_java 阅读(844) 评论(0) 推荐(0) 编辑
摘要: 缓存管理器CacheManager 一、背景 ​ 代码并发量因建行活动页上升,大量请求打到Mongo导致数据库cpu100%从而服务不可用,目前解决方案,使用编程式缓存,即对缓存的操作与业务代码耦合。目前基本上可以解决并发问题。此次提出CacheManager主要是优化代码。使用声明式,即注解的方式 阅读全文
posted @ 2022-12-06 14:38 simonlee_java 阅读(338) 评论(0) 推荐(0) 编辑
摘要: Redis模糊匹配Key值 使用Redis的scan代替Keys指令: public Set<String> scan(String matchKey) { Set<String> keys = (Set<String>)redisTemplate.execute((RedisCallback<Se 阅读全文
posted @ 2022-12-06 14:34 simonlee_java 阅读(2622) 评论(0) 推荐(0) 编辑
摘要: 1、Semaphore信号量源码解析(基于jdk11) 1.1 Semaphore概述 public class Semaphore extends Object implements Serializable Semaphore直译过来就是信号量,被作为一种多线程并发控制工具来使用。 Semaph 阅读全文
posted @ 2022-12-06 14:23 simonlee_java 阅读(125) 评论(0) 推荐(0) 编辑
摘要: CyclicBarrier循环屏障源码解析(基于jdk11) 1.1 CyclicBarrier概述 public class CyclicBarrier extends Object CyclicBarrier被称为循环屏障/同步屏障,它可以使一定数量的线程反复在"屏障"上汇集,当线程达到"屏障" 阅读全文
posted @ 2022-12-06 14:13 simonlee_java 阅读(31) 评论(0) 推荐(0) 编辑
摘要: CountDownLatch闭锁源码解析(基于jdk11) 1.1 CountDownLatch概述 public class CountDownLatch extends Object CountDownLatch是一种同步工具,常被称为"闭锁",也叫做"倒计数器"。在完成一组正在其他线程中执行的 阅读全文
posted @ 2022-12-06 10:43 simonlee_java 阅读(44) 评论(0) 推荐(0) 编辑