一、笔记
(1) 控制定时任务的执行
1. 浪费资源,想象 10000 台服务器同时 “打鸣”
2. 脏数据,比如重复插入
做法:
1. 分离定时任务程序和主程序,只在 1 个服务器运行定时任务。成本太大
2. 写死配置,每个服务器都执行定时任务,但是只有 ip 符合配置的服务器才真实执行业务逻辑,其他的直接返回。成本最低;但是我们的 IP 可能是不固定的,把 IP 写的太死了
3. 动态配置,配置是可以轻松的、很方便地更新的(**代码无需重启**),但是只有 ip 符合配置的服务器才真实执行业务逻辑。问题:服务器多了、IP 不可控还是很麻烦,还是要人工修改
- 数据库
- Redis
- 配置中心(Nacos、Apollo、Spring Cloud Config)
4. 分布式锁,只有抢到锁的服务器才能执行业务逻辑。坏处:增加成本;好处:不用手动配置,多少个服务器都一样。
(2) 单机锁
有限资源的情况下,控制同一时间(段)只有某些线程(用户 / 服务器)能访问到资源。
Java 实现锁:synchronized 关键字、并发包的类
问题:只对单个 JVM 有效;只对本服务器的程序有控制效果,对于其他分布式服务器上,没有作用。
(3) 分布式锁
1. 有限资源的情况下,控制同一时间&#x