缓存击穿: 是指对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:如果这个key在大量请求同时进来之前正好失效,那么所有对这个key的数据查询都落到db,我们称为缓存击穿。
与缓存雪崩的区别:
1. 击穿是一个热点key失效
2. 雪崩是很多key集体失效
解决:锁
使用分布式锁
使用Redisson解决分布式锁
2.1 本地锁的局限性
之前,我们学习过synchronized及lock锁,这些锁都是本地锁。接下来写一个案例,演示本地锁的问题
就是使用集群(同一个服务,不同端口)的时候本地锁锁不住
分布式锁基本实现方式
1.1基于数据库实现分布式锁
性能略低!
1.2基于缓存(Redis等)
性能搞!
1.3基于Zookeeper
可靠性高!
针对我们电商项目:性能搞!采用Redis!
需要的命令
setnx 当不存在的时候创建key v键值对,返回1,存在返回0
del 表示删除当前key
基本实现。
问题:setnx刚好获取到锁,业务逻辑出现异常,导致锁无法释放
解决:设置过期时间,自动释放锁。
但是这个方案有问题,也就是执行逻辑时候过期了,别人进来创建一个锁,此时会释放别人的锁