【Java】短 URL 生成器设计:百亿短 URL 怎样做到无冲突?

一、内容分析

在社交媒体上,人们经常需要分享一些URL,但是有些URL可能会很长,比如:https://geek.qq.org/hybrid/pvip?utm_source=geek-pc-discover-banner&utm_term=geek-pc-discover-banner

这样长的URL显然体验并不友好。我们期望分享的是一些更短、更易于阅读的短URL,比如像 http://1.cn/ScW4dt 这样的。当用户点击这个短URL的时候,可以重定向访问到原始的链接地址。为此我们将设计开发一个短URL生成器,产品名称是“Fuxi(伏羲)”。

我们预计Fuxi需要管理的短URL规模在百亿级别,并发吞吐量达到数万级别。这个量级的数据对应的存储方案是什么样的?用传统的关系数据库存储,还是有其他更简单的办法?此外,如何提升系统的并发处理能力呢?这些是我们今天要重点考虑的问题。

8.1 需求分析

短URL生成器,也称作短链接生成器,就是将一个比较长的URL生成一个比较短的URL,当浏览器通过短URL生成器访问这个短URL的时候,重定向访问到原始的长URL目标服务器,访问时序图如下。

对于需要展示短URL的应用程序,由该应用调用短URL生成器生成短URL,并将该短URL展示给用户,用户在浏览器中点击该短URL的时候,请求发送到短URL生成器(短URL生成器以HTTP服务器的方式对外提供服务,短URL域名指向短URL生成器),短URL生成器返回HTTP重定向响应,将用户请求重定向到最初的原始长URL,浏览器访问长URL服务器,完成请求服务。

8.1.1 短URL生成器的用例图

  1. 用户client程序可以使用短URL生成器Fuxi为每个长URL生成唯一的短URL,并存储起来。
  2. 用户可以访问这个短URL,Fuxi将请求重定向到原始长URL。
  3. 生成的短URL可以
### 解决方案分析 #### 问题描述 MyBatis Generator Plus 在生成代码时,可能出现 Controller 和 Service 类为空的情况。这通常是因为配置不当或未正确启用某些选项。 --- #### 配置原因及解决方案 1. **禁用了特定模块的生成逻辑** 如果在 `mybatis-plus-generator` 的配置中设置了禁用 Controller 或 Service 的生成,则可能导致这些文件的内容为空。例如,在较高版本(如 3.5.6 及以上),仅调用 `controllerBuilder().disable()` 并不足以完全阻止 Controller 文件的生成,还需要将对应的输出路径设为 `null` 或空字符串[^2]。 ```java GlobalConfig globalConfig = new GlobalConfig(); globalConfig.getControllerConfig() .setEnable(false); // 禁用控制器生成 ``` 同样适用于 Service 层: ```java StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setServiceName("%sService"); // 设置服务名称规则 ``` 2. **模板文件缺失或错误** MyBatis-Plus 使用 Velocity 模板引擎来定义生成代码的样式。如果自定义模板文件不完整或存在语法错误,可能会导致生成的代码内容为空。建议检查模板文件是否存在以及是否被正确加载[^4]。 - 默认情况下,模板文件应位于项目的资源目录下(通常是 `/templates` 路径)。 - 若使用了自定义模板,请确认其路径已正确定义到 `TemplateConfig` 中。 ```java TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setController("/path/to/custom/controller.vm"); ``` 3. **策略配置不合理** 当前使用的策略可能不符合实际需求。例如,表名映射规则、字段过滤条件等都可能影响最终生成的结果。可以通过调整 `StrategyConfig` 来优化生成行为[^3]。 ```java StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setInclude(new String[]{"table_name"}); // 显式指定要生成的表 strategyConfig.setSuperServiceImplClass(BaseServiceImpl.class); // 自定义父类 ``` 4. **依赖冲突或其他环境因素** 如果项目中有多个不同版本的 MyBatis-Plus 或其他相关库共存,也可能引发异常情况。确保所引入的依赖版本一致且无冲突。 ```xml <!-- Maven 示例 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新稳定版</version> </dependency> ``` --- #### 实现示例 以下是完整的代码生成器配置案例,供参考: ```java import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; public class CodeGenerator { public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); gc.setAuthor("Your Name"); gc.setOpen(false); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("password"); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.example.project"); pc.setModuleName(null); mpg.setPackageInfo(pc); // 策略配置 StrategyConfig sc = new StrategyConfig(); sc.setNaming(NamingStrategy.underline_to_camel); sc.setColumnNaming(NamingStrategy.underline_to_camel); sc.setEntityLombokModel(true); sc.setRestControllerStyle(true); sc.setInclude(new String[]{"example_table"}); mpg.setStrategy(sc); // 执行生成 mpg.execute(); } } ``` --- #### 总结 通过对上述几个方面的排查与修正,可以有效解决 MyBatis Generator Plus 生产的 Controller 和 Service 文件为空的问题。具体措施包括但不限于重新审视全局配置项、验证模板文件可用性、合理设定生成策略以及排除潜在的外部干扰因素。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值