redis缓存
为什么流量增大会导致数据库崩溃
数据库压力增大导致程序崩溃的原因主要有以下几点:
系统层面:
- 资源耗尽:
- 当数据库接收到大量请求时,CPU、内存和磁盘I/O等资源会迅速消耗殆尽,导致系统无法处理新的请求。
- 网络瓶颈:
- 数据库与应用服务器之间的网络带宽可能成为瓶颈,导致请求延迟和丢失。
数据库服务层面:
- 连接数限制:
- 数据库通常会限制同时连接的数量。当超过这个限制时,新连接将被拒绝,导致应用程序无法与数据库通信。
- 锁竞争:
- 在高并发情况下,多个事务可能会争夺同一资源,导致锁竞争加剧,进而引发死锁或长时间等待,影响系统性能。
- 查询性能下降:
- 随着流量增加,复杂查询的执行时间可能显著增长,导致响应延迟,最终可能导致应用程序超时崩溃。
- 错误处理不足:
- 应用程序在面对数据库压力时,如果没有进行适当的错误处理,可能会因为无法处理异常而崩溃。
数据库缓存层面:
- 缓存失效:
- 数据库的缓存机制可能因流量激增而失效,导致频繁的磁盘读取,进一步增加了负载。
综上所述,数据库压力增大可以通过多种方式影响系统的稳定性,导致程序崩溃。为了避免这种情况,通常需要进行性能优化、负载均衡和资源监控等措施。
Redisson实现分布式锁
加锁:
- lua脚本
- 锁hash结构,key:资源值,fild=uuid+线程id,value:1
- 获取锁逻辑
- lua原子操作判断当前hash是否存在
- fild & value
- lua看门狗自动重新设置时间
- // 发布订阅,其他线程阻塞,通知其他线程
- 超时释放锁机制:默认超时时长 = 3000 + 1500 * 3 = 7500 毫秒
- 取消订阅
解锁:
- lua脚本删除锁
- 取消定时续期,看门狗策略
- 取消订阅