wallpaper-api:基于Golang+Redis的随机壁纸API
前言
最近有空学了 Golang,并动手写了个小项目,算是现学现用,主要是为了加深理解。由于刚入门,项目中可能会有一些错误或不够优化的地方,还请多多指教
项目介绍
目前在网上存在着很多公共壁纸API,但是大部分API的访问速度十分感人,尤其在高流量的情况下容易出现访问延迟或超时的情况。所以就打算自己实现一个,也借此机会提升对Golang的理解和应用。目前项目主要基于Golang语言实现,结合Gin框架处理HTTP请求,同时采用Redis作为缓存管理,结合OSS(对象存储服务)存储壁纸图片,以确保高效的图片存储与读取能力。在通过一系列的优化,提升了壁纸API的访问速度和稳定性,在高并发场景下依然能保持良好的响应性能。
项目特点
1、后端技术栈:
- Golang:作为后端开发语言,Golang以其并发性、轻量级和高效性成为现代API开发的优选语言。本项目充分利用了Golang的高性能网络处理能力和内存管理,确保在大量请求下依然保持高效处理。
- Gin框架:Gin是一个基于Golang的高性能Web框架,采用了路由器、JSON解析和中间件等功能,使得API请求处理非常高效且易于扩展。本项目通过Gin提供了灵活的路由设计,确保API的可维护性和扩展性。
2、高效的缓存机制:
- Redis缓存:为了提升壁纸的读取速度并减少对OSS的频繁请求,本项目使用Redis作为缓存系统。Redis以其高效的内存存储特性,能够极大地减少数据的访问延迟,提供快速的数据读取和写入功能。壁纸数据存储在 Redis 的列表中,保证快速读取。
- 随机壁纸缓存:为了实现壁纸的随机展示,系统采用了Redis的List数据结构来存储壁纸文件名,借助Redis的高效读取机制,通过先进后出确保每次请求都能快速获取到不同随机的壁纸,当对应标签的所有壁纸都获取一遍之后,会重置对应标签的缓存。
3、图片存储与管理:
- OSS(对象存储服务):壁纸图片通过OSS进行存储,OSS提供了高可用、高性能的存储服务,适用于大规模图片的存储与管理。本项目通过与OSS的集成,能够高效地上传和读取壁纸资源,避免了本地存储的空间压力和管理复杂性,当然还需要配置一个CDN加速域名来访问。
4、API设计与功能:
- 设备类型支持:API设计支持根据不同的设备类型(如PC、手机等)返回不同分辨率的壁纸,后续考虑在此基础上添加更多标签。
- 上传壁纸功能:用户可以选择对应设备标签,单个或批量上传图片,同时同步更新到Redis缓存中。
- 壁纸随机获取:通过调用API,用户可以获取到随机壁纸,系统会从Redis缓存中获取壁纸列表,并随机返回一张。同时在取缓存和自动刷新缓存时新增了Redis分布式锁,避免了在高并发情况下发生缓存竞争。
5、性能与稳定性优化:
- 限流机制:为了避免高并发访问导致服务器压力过大,本项目实现了基于IP的请求限流功能。通过限制每秒的请求数,确保API的稳定性,避免因流量过大导致系统崩溃或响应延迟。
本站已使用该API,刷新页面即可显示实际效果,或者在美化设置中自行设置,如下所示。
项目部署
1、自行下载源码编译打包后自部署,需要如下前置条件以及相关环境:
自行修改./configs/config.yaml
配置文件:
1 | server: |
提前安装以下软件:
- redis@latest
- Go@1.20
设置Nginx代理,示例如下所示
1 | location / { |
2、通过Docker部署
新增docker-compose.yml配置文件,输入以下内容,####
部分配置需要自行修改:
1 | version: '3.8' |
然后输入以下命令拉取镜像启动即可
1 | docker compose up -d |
设置Nginx代理,示例如下所示
1 | location / { |
3、通过GitHub action发布到Docker hub自行部署
参考
总结
其实还有很多功能想实现,但暂时没有时间,比如图片的增删查改等管理功能。当然这些都是后话,留待以后有时间再开发。目前系统还缺少一个监控图片上传功能,如果你用的是阿里云OSS的,可以配置阿里云函数计算写个脚本监控OSS上传图片的事件,调用刷新缓存的接口,这样就不需要手动刷新。但是这块我也不太熟悉。所以就没弄了,如果感兴趣的话可以搜索一下。