分布式锁+分布式下的缓存问题
- 当微服务模式时,多个相同服务之间对于数据库需要保持数据一致性.此时需要从本地锁 演变为 分布式锁.
- 本博文通过进阶的形式 不断提出问题以及解决思路,一步一步完善代码,实现具有高可靠性的分布式锁功能.
使用redis的set命令带NX(not exist)参数实现分布式锁
NX:只有当不存在时,才可以set;成功set会返回OK,不成功返回null
//分布式锁
public Map<String, List<Catelog2Vo>> getCatalogJsonFromDBWithRedisLock() {
//1、占分布式锁。去redis占坑
Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent("lock", "lock");
if(aBoolean){
//加锁成功 执行业务
Map<String, List<Catelog2Vo>> dataFromDB = this.getDataFromDB();
//删除锁
stringRedisTemplate.delete("lock");
return dataFromDB;
}else {
//加锁失败 重试 自旋
return getCatalogJsonFromDBWithRedisLock();
}
}
阶段二 独立加上分布式锁的过期时间
//分布式锁
public Map<String, List<Catelog2Vo>> getCatalogJsonFromDBWithRedisLock() {
//1、占分布式锁。去redis占坑
Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent("lock", "lock");
if(aBoolean){
//加锁成功 执行业务
//2、设置过期时间
stringRedisTemplate.expire("lock",30, TimeUnit.SECONDS);
Map<String, List<Catelog2Vo>> dataFromDB = this.getDataFromDB();
//删除锁
stringRedisTemplate.delete("lock");
return dataFromDB;
}e