Golang编写简单图片服务器

本文介绍了如何使用Golang来构建一个简单的图片服务器,以解决大量图片存储的性能问题。通过文件ID分区策略,随机数生成,JSON配置文件读取以及使用gorilla/mux处理Web接口,实现了上传和下载功能。Golang的协程机制使得实现高并发变得简单。
摘要由CSDN通过智能技术生成

Golang编写简单图片服务器

图片服务器

最近的开发过程中,遇到一个问题,就是大量零碎图片的存储,最后我决定研究一个简单的图像服务器,以解决图像文件存储的性能问题。在此,写一篇博文记录我经历的思想过程和遇到的坑。
我们知道Linux存储文件不建议将大量文件存储到一个文件夹,这样做不仅容易大量消耗系统的iNode块,也很容易发生文件读写速度快速下降。

解决方案

通过分析需求,可得出一个方案,就是尽可能的让文件随机分布在不同的文件夹中,考虑到文件夹子文件数1000是个性能坎,可以给文件分配编号fileid,通过给fileid分区,就可以避免性能问题。
为了增加整个服务器的持续度,我决定使用uint64作为文件id,这样可以提供更大的计数区间,减少新建fileid的碰撞概率。

基本结构

结构很简单:
随机fileid发生器,fileid转文件路径(存储路径),JSON配置文件读取,上传、下载控制器

Golang使用JSON做配置文件

这里值得写的还是比较多的,

随机数生成

随机数生成部分我选择了seehuhn编写的mt19937库,项目地址:github.com/seehuhn/mt19937。
值得一提的是这个随机数库给的文档并不能用,简单地看了一下代码,发现正确用法应该是这样的:

    mt:=mt19937.New()
    mt.Seed(time.Now().UnixNano())
    var buf = make([]byte, 8)
    randuint64:=mt.Uint64()

随机fileid生成器代码

func MakeImageID()string{
    mt:=mt19937.New()
    mt.Seed(time.Now().UnixNano())
    var buf = make([]byte, 8)
    binary.BigEndian.PutUint64(buf, mt.Uint64())
    return strings.ToUpper(hex.EncodeToString(buf))
}

我生成的fileid最后是这样形式的:6A778903AD673478,16位十六进制字符串,很适合存储在数据库中。

fileid转文件路径

使用了很Ugly的Sprintf方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值