Home

SpringBoot整合Redis集群模式

1.redis集群模式配置 1.引入redis的依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.1</version> </dependency> 2.配置Jedis Pool和Client # 最大连接数 spring.redis.pool.max-active=100 # 最大阻塞等待时间 spring.redis.pool.max-wait=2000 # 最大空闲连接 spring.redis.pool.max-idl...

Read more

方案设计 | 基于Redis的分布式锁设计

1.基于Redis客户端的设计 1.初级设计 public class JuniorRedisLock implements RedisLock{ @Autowired private StringRedisTemplate redisTemplate; @Override public boolean lock(String key) { long id = Thread.currentThread().getId(); Boolean result = redisTemplate.opsForValue().setIfAbsent(LOCK_PREFIX + key, id + ""); return...

Read more

SpringCloud | OpenFeign原理

OpenFeign 是声明式的 HTTP 客户端,让远程调用更简单。 提供了HTTP请求的模板,编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息 整合了Ribbon(负载均衡组件)和 Hystix(服务熔断组件),不需要显示使用这两个组件同时Spring Cloud Feign 在 Netflix Feign的基础上扩展了对SpringMVC注解的支持 对于该注解我会分成两部分去解析: 1. 开发使用;2.原理解析。其中原理解析会分为两部分分别是启动和加载的过程。 1. FeignClient的用法 1.定义一个接口,在接口上加@FeignClient,该注解提供了很多参数: name/value:指定FeignClient的名称,如果项目使用了Ri...

Read more

方案设计 | 分页缓存组件设计

1.初衷 在项目开发中,通常我们会将某个完整对象存储在缓存中,但很少会对分页数据做缓存处理。 在设计这个组件之前,基本没有专门处理分页缓存的方案。 由于 Redis 提供了丰富的数据结构,我们选择了ZSet(有序集合) 来支持分页场景。 ✅ 为什么选择 ZSet? 分页数据通常要求 有序,需要按某个指标(如创建时间)排序。 ZSet 保证了数据的有序性; 可将排序字段(如创建时间戳)作为 score; 利用 rangeByScore 等命令获取分页数据,高效简洁。 2.分页缓存方法论 2.1初级应用 以订单数据作为例子。 💡 场景:商家需要查看某产品的所有订单,按创建时间倒序排列。 📌 数据结构设计 项目 ...

Read more

方案设计 | 基于MySQL二阶段提交保证DB与ES数据一致性

1. MySQL二阶段提交 二阶段的初衷是为了保证MySQL在发生宕机时对数据一致性的保证,主要是对redo log和bin log的两阶段的提交。 (图片来源:小林coding) 二阶段: 在开启bin log的前提下,为了保证bin log和redo log的一致性,MySQL内部会维护XA事务。该事务主要由bin log作为协调者,redo log是参与者。 XA事务内部会维护一个事务ID(XID) prepare阶段:将XID写入redo log并且,将该log标记为prepare状态,同时将redo log写入磁盘(前提设置每次事务执行持久化) commit阶段:将XID写入bin log,然后将bin log写入磁盘,接着调用存储引擎将redo lo...

Read more

问题排查总结

1.内存溢出 导致内存溢出的原因有很多,例如堆内存的不合理分配,内存泄漏导致的内存溢出,甚至是大对象创建速度大于GC回收的数据同样也会导致内存溢出。 1.1内存分配溢出 设置如下配置让堆内存溢出更快: -Xms40m 初始堆大小设置为40m -Xmx70m 最大堆大小设置为70m @GetMapping("/memory/error2") public void outOfMemory2(){ while(true){ String[] stringArray = new String[10 * 1024 * 1024]; } } 排查思路: 查找Java的进程id jps 可以查看ja...

Read more

Redis | Redis集群模式搭建

Redis存在三种模式:主从模式,哨兵模式和集群模式。对于集群模式的话,用于生产实践中是最多的,因为其利用了分片的思想,对其水平扩展很友好。 本文主要讲述Redis集群模式搭建过程以及一些注意事项,包括集群搭建后的水平扩容和缩容。原谅小编没有那么多机器,所以只能搭建一个伪集群模式,完全不影响搭建的过程,因为真正集群模式的话在不同的机器上,伪集群的话在相同的机器上,所以对于每一个实例只要做到端口号不一样就可以了。 1.搭建集群 1.下载redis wget https://download.redis.io/releases/redis-6.0.8.tar.gz 2.解压redis tar -zxvf redis-6.0.8.tar.gz 解压后你会发现如下的两个文件 1...

Read more

Spring | Async注解

1. Async注解的用法 1.1初级用法 1.在启动类或者配置类加上@EnableSync; 2.在需要异步执行方法或者类上加@Async注解; 3.另外一个方法调用该方法即可; 简单Demo代码如下所示: //启动类 @SpringBootApplication @EnableAspectJAutoProxy @EnableAsync public class SpringBootWithDockerStarter { public static void main(String[] args) { SpringApplication.run(SpringBootWithDockerStarter.class, args); } } //...

Read more

方案设计 | 循环器的设计:再见死循环

在我们业务开发过程中,经常会有使用分页批量查询数据。例如:我想获取某个商品所有的订单,根据订单数据做出相应的逻辑处理。这时我们需要分批量去获取数据,处理完一批后,如果还有的那么再去获取,就这样循环执行。问题就出现在这个循环上。 1.方法论设计 那接下来从Sql查询的着手,通常情况下有两种分页查询获取数据的方式: select * from table_name where id = #{id} limit #{offset}, #{pageSize} select * from table_name where id = #{id} and created_time> {nextPageToken} 对于第一种情况而言,我们不用关心返回数据的具体内容是什么,我...

Read more

Spring | 动态代理的背后原理

之前我讲过关于JDK代理和CGLIB代理如何实现无反射调用目标方法,今天咱们聊聊动态代理两个方面:一是代理对象是怎么生成的;二是代理对象的执行过程; 1. 创建代理对象 接下来会对Spring创建代理的步骤进行介绍,如何一步一步创建代理对象的,并且会通过问题和代码的形式来阐明创建代理的过程。 首先我们得理解一下这三者的关系Advisor Advice Aspect: Advisor可以理解成时一种切面,由切点和通知组成,低级切面; Advice是通知概念,也就是需要增强的内容; Aspect是我们通常所知的切面,高级切面; 高级切面 和低级切面区别主要是前者一个切面可以存在多个通知,而后者一个切面只能存在一个通知。 Spring在第一个Bean加载的时候就会去...

Read more