一个Golang开发的短网址服务
Windows下请直接正确配置config.json文件,并且开启好相关环境(MySQL,Redis)然后即可运行bin目录下已经编译好的二进制可执行文件。
Linux下请手动编译,启动时需要开启的环境和Windows一致。
可选启动参数:tinyurl.exe -config C:\config.json
首次启动时保证可执行文件目录下有tinyurl.sql.tpl文件,该文件为数据库DDL模版,用于生成数据库表结构。
启动之后访问http://ip:port/l=长网址
,会返回json格式的数据,里面有对应的短网址部分,直接访问http://ip:port/短网址
即会自动跳转到对应的原始长网址。其中ip,port,l等参数均可在config.json配置文件中修改。
- 修复缓存读取时所使用的key未加prefix导致所有请求无法利用缓存的缺陷
- db包下的mysql操作库修正命名为mysql.go
- 增加rand种子以当前时间戳取值
- 修复url随机构造部分未考虑到高并发场景下由于rand种子取值窗口过小导致碰撞几率变大,在mysql数据库下当事务隔离级别为“Repeatable read”时可能导致幻读的缺陷
TinyUrl短网址服务(http://github.com/cw1997/TinyUrl)
一个很简单的短网址服务,支持自定义短链接规则,后台使用Golang+缓存+连接池,保功能简单的同时兼顾性能。
- 轻量,简单。支持自定义短网址规则。
- 通过MySQL持久化存储短网址与长网址的映射。通过Redis缓存加速,通过连接池提升高并发下的IO。
- 可控性强,配置化,很多参数可以通过配置文件修改。
- 核心功能未写接口,导致后期替换模块不方便,比如说要把缓存从Redis换成Memcached则需要修改缓存代码。
- 短网址生成的算法和策略过于简单,没有解决单个长网址被多次重复提交短网址生成请求时导致的冗余数据问题。
- Redis未使用集群,MySQL未使用分库分表,导致后续数据量大的时候可能出现性能以及扩展问题。
虽然Golang是一门开发效率极高的静态强类型编程语言,但是并不意味着用它开发就可以对性能问题高枕无忧了。因为很多应用的性能瓶颈其实都在IO上。使用它开发高并发项目仍然需要对架构与设计有着更多广度和深度的理解。并且由于它本身不是面向对象编程语言,那么写出优雅,高内聚低耦合的项目并不是那么容易。