短链接高并发访问问题:
采用缓存预加载+分布式锁双重判定缓存+空对象缓存+布隆过滤器的方案解决缓存穿透,缓存击穿问题。
t-link表存储包括gid,长链接,短链接的所有信息,分片键是gid;
t-link-goto表仅存储gid和short-url,分片键是short-url,
用户过来访问的时候仅带上了short-url,因此只能先通过ShortLinkGotoDO带上分片键short-url查询出对应gid,再通过ShortLinkDO带上前面查询的gid,这个gid也是t-link的分片键,查询得到长链接,最后就哦了,分表了,因此必须带上分片键,否则会读扩散Union All
@SneakyThrows
@Override
public void restoreUrl(String shortUri, ServletRequest request, ServletResponse response) {
// 短链接接口的并发量有多少?如何测试?详情查看:https://nageoffer.com/shortlink/question
// 面试中如何回答短链接是如何跳转长链接?详情查看:https://nageoffer.com/shortlink/question
String serverName = request.getServerName();
String serverPort = Optional.of(request.getServerPort())
.filter(each -> !Objects.equals(each, 80))
.map(String::valueOf)
.map(each -> ":" + each)
.orElse("");
String fullShortUrl = serverName + serverPort + "/" + shortUri;
// 第一次查询Redis短链接缓存获取对应的长链接,如果获取到,那么重定向302到长链接
String originalLink = stringRedisTemplate.opsForValue().get(String.format(GOTO_SHORT_LINK_KEY, fullShortUrl));
if (StrUtil.isNotBlank(originalLink)) {
shortLinkStats(buildLinkStatsRecordAndSetUser(fullShortUrl, request, response));
(