# 前言
博客最近进行迁移,原本使用 wordpress,现迁移至 hexo。从原来的腾讯云轻量应用服务器迁移到 cloudflare page。既然如此,那原本部署在腾讯云上使用 python 搭建的随即图 api 也没必要存在了。做随机图 api 的初衷只是因为想要自己喜欢的图。
注:博主的图片只有不到 30 张,小样本使用,数量较少。
# 正文
# 思路
比较简单,cloudflare kv 有 1G 空间,把 hash 和图片对应的路径存进 kv 里,然后 worker 从 kv 里随机取一个出来跳转到 jsdelivr 就行了
# 随机图接口
由于 cloudflare kv 的免费额度限制,write、delete、list 每天只有 1000 次,而 read 有 10 万次, 所以尽可能将 kv 操作使用 read 来实现。
kv 中存储了一个 index 数据,用来查找数据,如下:
{ | |
"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 中
# 资源消耗
# 随机图接口
于是每次随机一张图会产生两次 read 操作,一次从索引中拿到 map_key, 一次从 map 中取数据,以每天 cloudflare kv 每天 10 万次免费的 read,一天可以请求随机图接口 5 万次
# 数据更新接口
假设 kv 中每个表存储 1000 条数据,kv 中已有一个表存储 100 条数据,更新的数据有 2000 条,更新时会读取索引值一次,读取已存在的所有表(这里为一次),更新的信息为 已经存在的表 1 增加了 900 条数据,创建表 2 及表 2 1000 条数据,创建表 3 及表 3 100 条数据,索引值更新。此时会对 kv 做 4 次写入,总共是 2 次读取,4 次写入。
# 步骤
在 github 上创建一个空仓库用于存放图片,然后将自己喜欢的图片提交到该仓库即可,然后就可以在 jsdelivr 上取到该仓库的文件
https://cdn.assets.taoidle.com/gh/github用户名/仓库名@分支
克隆 RandPicWorker 这个项目,在项目根目录下执行 yarn 打好依赖。然后使用以下命令登录 cloudflare
yarn run wrangler login
在 cloudflare 上创建一个 kv namespace
填写项目里 wrangler.toml 文件缺少的信息
执行 package.json scripts 里的 publish 命令
随便写个脚本把图片信息丢上去完事 本来这里是有个 rust 写的程序的,用于将图片转为 webp 然后把 hash 值和路径丢到 worker 上,但是由于目前比较忙,有空再写
# 结束语
代码过于简单没啥好说的,好久没写博客了上来水一篇
端午假期稍微更新了一下