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...
方案设计 | 基于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...
SpringCloud | OpenFeign原理
OpenFeign 是声明式的 HTTP 客户端,让远程调用更简单。
提供了HTTP请求的模板,编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息
整合了Ribbon(负载均衡组件)和 Hystix(服务熔断组件),不需要显示使用这两个组件同时Spring Cloud Feign 在 Netflix Feign的基础上扩展了对SpringMVC注解的支持
对于该注解我会分成两部分去解析: 1. 开发使用;2.原理解析。其中原理解析会分为两部分分别是启动和加载的过程。
1. FeignClient的用法
1.定义一个接口,在接口上加@FeignClient,该注解提供了很多参数:
name/value:指定FeignClient的名称,如果项目使用了Ri...
方案设计 | 分页缓存组件设计
1.初衷
在项目开发中,通常我们会将某个完整对象存储在缓存中,但很少会对分页数据做缓存处理。
在设计这个组件之前,基本没有专门处理分页缓存的方案。
由于 Redis 提供了丰富的数据结构,我们选择了ZSet(有序集合) 来支持分页场景。
✅ 为什么选择 ZSet?
分页数据通常要求 有序,需要按某个指标(如创建时间)排序。
ZSet 保证了数据的有序性;
可将排序字段(如创建时间戳)作为 score;
利用 rangeByScore 等命令获取分页数据,高效简洁。
2.分页缓存方法论
2.1初级应用
以订单数据作为例子。
💡 场景:商家需要查看某产品的所有订单,按创建时间倒序排列。
📌 数据结构设计
项目
...
方案设计 | 基于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...
问题排查总结
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...
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...
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);
}
}
//...
方案设计 | 循环器的设计:再见死循环
在我们业务开发过程中,经常会有使用分页批量查询数据。例如:我想获取某个商品所有的订单,根据订单数据做出相应的逻辑处理。这时我们需要分批量去获取数据,处理完一批后,如果还有的那么再去获取,就这样循环执行。问题就出现在这个循环上。
1.方法论设计
那接下来从Sql查询的着手,通常情况下有两种分页查询获取数据的方式:
select * from table_name where id = #{id} limit #{offset}, #{pageSize}
select * from table_name where id = #{id} and created_time> {nextPageToken}
对于第一种情况而言,我们不用关心返回数据的具体内容是什么,我...
Spring | 动态代理的背后原理
之前我讲过关于JDK代理和CGLIB代理如何实现无反射调用目标方法,今天咱们聊聊动态代理两个方面:一是代理对象是怎么生成的;二是代理对象的执行过程;
1. 创建代理对象
接下来会对Spring创建代理的步骤进行介绍,如何一步一步创建代理对象的,并且会通过问题和代码的形式来阐明创建代理的过程。
首先我们得理解一下这三者的关系Advisor Advice Aspect:
Advisor可以理解成时一种切面,由切点和通知组成,低级切面;
Advice是通知概念,也就是需要增强的内容;
Aspect是我们通常所知的切面,高级切面;
高级切面
和低级切面区别主要是前者一个切面可以存在多个通知,而后者一个切面只能存在一个通知。
Spring在第一个Bean加载的时候就会去...
51 post articles, 6 pages.