短链接核心4:修改短链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
@Transactional(rollbackFor = Exception.class)
@Override
public void updateShortLink(ShortLinkUpdateReqDTO requestParam) {
verificationWhitelist(requestParam.getOriginUrl());
LambdaQueryWrapper<ShortLinkDO> queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class)
.eq(ShortLinkDO::getGid, requestParam.getOriginGid())
.eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl())
.eq(ShortLinkDO::getDelFlag, 0)
.eq(ShortLinkDO::getEnableStatus, 0);
ShortLinkDO hasShortLinkDO = baseMapper.selectOne(queryWrapper);
if (hasShortLinkDO == null) {
throw new ClientException("短链接记录不存在");
}
if (Objects.equals(hasShortLinkDO.getGid(), requestParam.getGid())) {
LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class)
.eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl())
.eq(ShortLinkDO::getGid, requestParam.getGid())
.eq(ShortLinkDO::getDelFlag, 0)
.eq(ShortLinkDO::getEnableStatus, 0)
.set(Objects.equals(requestParam.getValidDateType(), VailDateTypeEnum.PERMANENT.getType()), ShortLinkDO::getValidDate, null);
ShortLinkDO shortLinkDO = ShortLinkDO.builder()
.domain(hasShortLinkDO.getDomain())
.shortUri(hasShortLinkDO.getShortUri())
.favicon(Objects.equals(requestParam.getOriginUrl(), hasShortLinkDO.getOriginUrl()) ? hasShortLinkDO.getFavicon() : getFavicon(requestParam.getOriginUrl()))
.createdType(hasShortLinkDO.getCreatedType())
.gid(requestParam.getGid())
.originUrl(requestParam.getOriginUrl())
.describe(requestParam.getDescribe())
.validDateType(requestParam.getValidDateType())
.validDate(requestParam.getValidDate())
.build();
baseMapper.update(shortLinkDO, updateWrapper);
} else {
// 为什么监控表要加上Gid?不加的话是否就不存在读写锁?详情查看:https://nageoffer.com/shortlink/question
RReadWriteLock readWriteLock = redissonClient.getReadWriteLock(String.format(LOCK_GID_UPDATE_KEY, requestParam.getFullShortUrl()));
RLock rLock = readWriteLock.writeLock();
rLock.lock();
try {
LambdaUpdateWrapper<ShortLinkDO> linkUpdateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class)
.eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl())
.eq(ShortLinkDO::getGid, hasShortLinkDO.getGid())
.eq(ShortLinkDO::getDelFlag, 0)
.eq(ShortLinkDO::getDelTime, 0L)
.eq(ShortLinkDO::getEnableStatus, 0);
ShortLinkDO delShortLinkDO = ShortLinkDO.builder()
.delTime(System.currentTimeMillis())
.build();
delShortLinkDO.setDelFlag(1);
baseMapper.update(delShortLinkDO, linkUpdateWrapper);
ShortLinkDO shortLinkDO = ShortLinkDO.builder()
.domain(createShortLinkDefaultDomain)
.originUrl(requestParam.getOriginUrl())
.gid(requestParam.getGid())
.createdType(hasShortLinkDO.getCreatedType())
.validDateType(requestParam.getValidDateType())
.validDate(requestParam.getValidDate())
.describe(requestParam.getDescribe())
.shortUri(hasShortLinkDO.getShortUri())
.enableStatus(hasShortLinkDO.getEnableStatus())
.totalPv(hasShortLinkDO.getTotalPv())
.totalUv(hasShortLinkDO.getTotalUv())
.totalUip(hasShortLinkDO.getTotalUip())
.fullShortUrl(hasShortLinkDO.getFullShortUrl())
.favicon(Objects.equals(requestParam.getOriginUrl(), hasShortLinkDO.getOriginUrl()) ? hasShortLinkDO.getFavicon() : getFavicon(requestParam.getOriginUrl()))
.delTime(0L)
.build();
baseMapper.insert(shortLinkDO);
LambdaQueryWrapper<ShortLinkGotoDO> linkGotoQueryWrapper = Wrappers.lambdaQuery(ShortLinkGotoDO.class)
.eq(ShortLinkGotoDO::getFullShortUrl, requestParam.getFullShortUrl())
.eq(ShortLinkGotoDO::getGid, hasShortLinkDO.getGid());
ShortLinkGotoDO shortLinkGotoDO = shortLinkGotoMapper.selectOne(linkGotoQueryWrapper);
shortLinkGotoMapper.delete(linkGotoQueryWrapper);
shortLinkGotoDO.setGid(requestParam.getGid());
shortLinkGotoMapper.insert(shortLinkGotoDO);
} finally {
rLock.unlock();
}
}
// 短链接如何保障缓存和数据库一致性?详情查看:https://nageoffer.com/shortlink/question
if (!Objects.equals(hasShortLinkDO.getValidDateType(), requestParam.getValidDateType())
|| !Objects.equals(hasShortLinkDO.getValidDate(), requestParam.getValidDate())
|| !Objects.equals(hasShortLinkDO.getOriginUrl(), requestParam.getOriginUrl())) {
stringRedisTemplate.delete(String.format(GOTO_SHORT_LINK_KEY, requestParam.getFullShortUrl()));
Date currentDate = new Date();
if (hasShortLinkDO.getValidDate() != null && hasShortLinkDO.getValidDate().before(currentDate)) {
if (Objects.equals(requestParam.getValidDateType(), VailDateTypeEnum.PERMANENT.getType()) || requestParam.getValidDate().after(currentDate)) {
stringRedisTemplate.delete(String.format(GOTO_IS_NULL_SHORT_LINK_KEY, requestParam.getFullShortUrl()));
}
}
}
}

修改短链接分为两部

1. 修改短链接

1. 没有修改短链接分组 gid

直接修改短链接信息

2. 修改短链接分组 gid

加上读写锁
修改短链接表和短链接跳转表

2. 删除缓存保证数据一致性