# 前言
为了提高博客在国内的访问速度,于是决定做一个部署在国内的随机图 api。然后看了一下,又拍云可以白嫖免费的 cdn 和存储桶,leancloud 白嫖数据存储,腾讯云函数备案资源包 5 年一百多四舍五入不要钱,最终约等于白嫖麻了,舒服~
注:虽然但是,leancloud 数据存储 api 每天只能请求 3 万次,对于我这种小博客来说,问题不大。
# 正文
# 思路
简单来说,为了偷懒,和之前在 cloudflare worker 上的实现没区别,语言换成了 javasript,框架换成 express,数据存储换成 leancloud。
至于为什么之前的项目用的是 typescript 而这个变成了 javascript,主要原因 leancloud 的包在 typescript 和 webpack 一起用的时候会出莫名其妙的问题(其实是 webpack 出问题),赶时间不想排查原因。
# 随机图接口
leancloud 结构化数据中存储了一个 class 叫 Api_Data,class 中的 object 有 api_key 和 api_value 两个属性,其中有一个 api_key 属性值为 KV_INDEX 的 object 其属性 api_value 中存储了如下结构的数据,用于查找和索引:
{ | |
"KV_INDEX": { | |
"total_num": 300, | |
"map_total": 3, | |
"map_num": [ | |
"MAP_1_NUM", | |
"MAP_2_NUM", | |
"MAP_3_NUM" | |
], | |
"map_list": [ | |
"MAP_KEY_1", | |
"MAP_KEY_2", | |
"MAP_KEY_3" | |
] | |
} | |
} |
存储了若干个表,表如下
{ | |
"MAP_KEY_1": { | |
"pic_1_hash": "pic_1_path", | |
"pic_2_hash": "pic_2_path", | |
"pic_3_hash": "pic_3_path", | |
"pic_99_hash": "pic_99_path", | |
"pic_100_hash": "pic_100_path" | |
} | |
} |
{ | |
"MAP_KEY_2": { | |
"pic_101_hash": "pic_101_path", | |
"pic_102_hash": "pic_102_path", | |
"pic_103_hash": "pic_103_path", | |
"pic_199_hash": "pic_199_path", | |
"pic_200_hash": "pic_200_path" | |
} | |
} |
{ | |
"MAP_KEY_3": { | |
"pic_201_hash": "pic_201_path", | |
"pic_202_hash": "pic_202_path", | |
"pic_203_hash": "pic_203_path", | |
"pic_299_hash": "pic_299_path", | |
"pic_300_hash": "pic_300_path" | |
} | |
} |
于是每次随机一张图会产生两次 read 操作,一次从索引中拿到 map_key, 一次从 map 中取数据
# 数据更新接口
接受数据如下
{ | |
"pic_1_hash": "pic_1_path", | |
"pic_2_hash": "pic_2_path", | |
"pic_3_hash": "pic_3_path", | |
"pic_99_hash": "pic_99_path", | |
"pic_100_hash": "pic_100_path" | |
} |
更新数据时步骤如下
从 kv 中取索引,在从索引中获取到表中的 key
判断更新数据的 key 在表中时候存在,不存在则将该项添加到待更新表
全部待更新数据添加到待更新表后,更新索引数据,最后把所有更新的数据写入到 kv 中
# 步骤
在 又拍云 创建存储桶,绑定自定义域名,把资源上传到又拍云的存储桶中。在又拍云联盟加入开发者帮助计划,申请免费的云存储空间和 CDN 流量。
在 leancloud 国内版创建一个应用。
把 RandPiSCF 部署到腾讯云函数。
注意,需要配置一下环境变量 (在 leancloud 你创建的应用 -> 设置 -> 应用凭证):
LEANCLOUD_APP_ID leancloud 中的 AppID
LEANCLOUD_APP_KEY leancloud 中的 AppKey
LEANCLOUD_APP_MASTER_KEY leancloud 中的 MasterKey
LEANCLOUD_APP_SERVER_URL leancoud 中 REST API 服务器地址或者域名绑定中的 api 域名
PAGE_ITEM 数据存储中的分表
随便写个脚本把图片信息丢上去完事 本来这里是有个 rust 写的程序的,用于将图片转为 webp 然后把 hash 值和路径丢到 worker 和 scf 上,但是由于目前比较忙,有空再写
# 结束语
其实就是前文 使用 cloudflare 和 jsdelivr 做一个随机图 api 的腾讯云函数偷懒实现版本,并没有对使用的资源做任何优化。后续有空优化一下,反正目前对我来说够用。