什么事分布式事务:
多个服务同时修改记录时,保证数据的一致性.
分布式思路:
- 通过在redis设置一个唯一锁,如果存在key,则认为有其他客户端在使用,等待锁释放。
- 如果不存在key,说明没有客户端使用,可以执行任务,执行完毕,解锁,删除key.
存在的问题1 :
获得锁后,服务宕机,由于key是唯一的,所以无法被删除.
问题1解决方案
设置过期时间。
存在的问题2
任务执行过长,超过过期时间。
问题2解决方案
通过一个守护线程,给线程续命.
存在的问题3:
任务执行造成死循环,会造成无限续命.
问题3解决方案 :
设置最大续命时间。
使用redisTemplate代码如下
String uuid = UUID.randomUUID().toString();
boolean key = redisTemplate.opsForValue().setIfAbsent("key",uuid,5, TimeUnit.SECONDS);
if(key){
log.info("获得锁.");
int current =(int)redisTemplate.opsForValue().get("foodNum");
log.info("当前值:"+current);
redisTemplate.opsForValue().increment("foodNum");
redisTemplate.opsForList().rightPush("list","portal:"+current);
log.info("更新值:"+redisTemplate.opsForValue().get("foodNum"));
redisTemplate.delete("key");
}else {
log.info("无法获得锁");
}