短链接day8

短链接监控

开发访问单个短链接监控统计功能

不知道是哪里复制错了,反正就是一顿报错,改了这个又改那个,还是报错。。暂时不管了。

记录短链接访问日志

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()));
                }
            }
        }

短链接变更分组记录功能

之前的代码逻辑,如果存在短链接记录修改分组,那么就会变成短链接记录不存在问题。

  1.  删除原始短链接记录t_link表是更具gid进行分表的,若修改短链接的gid,则需要先删除原gid分表中的记录,再在新gid分表中插入修改后的短链接记录。

  2. 修改唯一索引:

用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);
        }

相关推荐

  1. day3

    2024-07-16 19:40:01       24 阅读
  2. 的理解

    2024-07-16 19:40:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 19:40:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 19:40:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 19:40:01       58 阅读
  4. Python语言-面向对象

    2024-07-16 19:40:01       69 阅读

热门阅读

  1. python基础语法

    2024-07-16 19:40:01       20 阅读
  2. vue 项目代码架构

    2024-07-16 19:40:01       18 阅读
  3. 通过 Nginx 修复 CORS 漏洞

    2024-07-16 19:40:01       21 阅读
  4. [C++ 入门基础 - 引用]

    2024-07-16 19:40:01       21 阅读
  5. Elasticsearch:将Logstash日志存到elasticsearch中

    2024-07-16 19:40:01       21 阅读
  6. 题解:P10678 『STA - R6』月

    2024-07-16 19:40:01       16 阅读
  7. 每天一个数据分析题(四百三十)- 假设检验

    2024-07-16 19:40:01       18 阅读
  8. 【PG】PostgreSQL高可用之repmgr命令手册

    2024-07-16 19:40:01       20 阅读
  9. GPT带我学-设计模式14-工厂模式

    2024-07-16 19:40:01       18 阅读
  10. InnoDB

    2024-07-16 19:40:01       21 阅读
  11. 跨入嵌入式day1(Linux下C语言-基础知识)

    2024-07-16 19:40:01       18 阅读
  12. sqlalchemy mapper的使用

    2024-07-16 19:40:01       17 阅读
  13. git初始化项目

    2024-07-16 19:40:01       18 阅读