短链接监控
开发访问单个短链接监控统计功能
不知道是哪里复制错了,反正就是一顿报错,改了这个又改那个,还是报错。。暂时不管了。
记录短链接访问日志
logdo新增networt、device、local属性。
分页查询短链接访问日志
分页查询短链接今日以及历史访问信息设计
统计短链接汇总访问数据
不知道为什么我的后管系统报错【用户Token验证失败】,但是调试中,只有admin的filter用来两次,其中都没有走错误,所以不知道会报错。。。导致后面的都无法校验了。
统计短链接监控之今日数据访问
分页查询短链接监控数据排序功能
COALESCE(s.today_pv, 0) AS todayPv
这段代码的作用是:如果 s.today_pv
(即某个表 s
中的 today_pv
字段)的值为NULL,则使用0作为替代值;如果 s.today_pv
不是NULL,则直接使用 s.today_pv
的值。最后,这个表达式的结果被命名为 todayPv
。
要做绑定表的设置:
bindingTables:
- t_link, t_link_stats_today
exist
:在某些场景下,我们可能想要表示某个属性不应该映射到数据库表的任何列上。
@TableField(exist = false)
统计短链接监控之指定时间内PV、UV、UIP数据
统计分组短链接监控数据
分页查询分组短链接访问日志
功能扩展
短链接创建时指定默认域名
application.yml
short-link:
domain:
default: nurl.ink:8001
通过以下获取:
@Value("#{short-link.domain.default}")
private String createShortLinkDefaultDomain;
shortlinkserverceimpl的restoreUrl增加这一部分。
String serverPort=Optional.of(request.getServerPort())
.filter(each->!Objects.equals(each,80))
.map(String::valueOf)
.map(each->":"+each)
.orElse("");
String fullShortUrl=servername+serverPort+"/"+shortUrl;
批量创建短链接
为什么短链接中台返回标准数据,后管返回Excel?
因为短链接中台是提供通用能力的中台,供N多客户端系统使用,不只是短链接后管,应该返回公共的返回参数,而不是直接返回 Excel 流。
因为可能有些某些其他客户端系统不做 Excel 流处理,如果客户端系统希望这种交互,让他们根据返回参数自己做处理就好。
修复短链接跳转空指针问题
做判空处理:shortLinkDO.getValidDate()!=null
修复短链接修改有限期后无法跳转问题
如果有效期与之前不一致了,需要将缓存删除
hasShortLinkDO是数据库中查到的数据
// 短链接如何保障缓存和数据库一致性?详情查看: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()));
}
}
}
短链接变更分组记录功能
之前的代码逻辑,如果存在短链接记录修改分组,那么就会变成短链接记录不存在问题。
-
删除原始短链接记录:t_link表是更具gid进行分表的,若修改短链接的gid,则需要先删除原gid分表中的记录,再在新gid分表中插入修改后的短链接记录。
-
修改唯一索引:
用url+flag如果修改后还在同一个表中,最多你就只能修改这一次,多一次都改不了,用了时间戳,想改多少次都可以。
3. 迁移相关业务表数据
将短链接相关的表进行数据修改,如果涉及到分片行为,先删除原有数据再新增。如果不涉及分片行为,只需要修改对应的数据库表记录即可。
4. 引入读写锁
如果短链接正在修改分组,这时有用户正在访问短链接,统计监控相关的分组还是之前的数据,是否就涉及到无法正确统计监控数据问题?
引入分布式锁?
引入分布式锁,则同一时间仅允许一个用户访问,显然不现实。
引入读写锁?
原来没有获取锁,现在获取了,其实还是会有性能损耗的,可能几十毫秒。。。
但是这里为了实现功能,引入读写锁是没毛病的。
5.引入延迟队列
如果用户正在修改短链接分组,因为涉及到表操作很多,我们假设可能会操作 300ms。
这 300ms 内难道就不允许用户访问?
可以用mq或者redis基于redisson的队列...
6. 回收站删除
因为加了 del_time
,所以回收站删除功能也要改造。
7. 修改短链接分组查询数量接口
添加 del_flag
条件。
短链接创建和修改验证跳转链接白名单
short-link:
goto-domain:
white-list:
enable: true
names: '拿个offer,知乎,掘金,博客园'
details:
- nageoffer.com
- zhihu.com
- juejin.cn
- cnblogs.com
变更用户已登录状态下异常行为
用户已登录状态如果重复登录返回Token:
用户登录实现类中
Map<Object, Object> hasLoginMap = stringRedisTemplate.opsForHash().entries(USER_LOGIN_KEY + requestParam.getUsername());
if (CollUtil.isNotEmpty(hasLoginMap)) {
stringRedisTemplate.expire(USER_LOGIN_KEY + requestParam.getUsername(), 30L, TimeUnit.MINUTES);
String token = hasLoginMap.keySet().stream()
.findFirst()
.map(Object::toString)
.orElseThrow(() -> new ClientException("用户登录错误"));
return new UserLoginRespDTO(token);
}