# 前言

博客最近进行迁移,原本使用 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"
  }

更新数据时步骤如下

  1. 从 kv 中取索引,在从索引中获取到表中的 key

  2. 判断更新数据的 key 在表中时候存在,不存在则将该项添加到待更新表

  3. 全部待更新数据添加到待更新表后,更新索引数据,最后把所有更新的数据写入到 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 次写入。

# 步骤

  1. 在 github 上创建一个空仓库用于存放图片,然后将自己喜欢的图片提交到该仓库即可,然后就可以在 jsdelivr 上取到该仓库的文件

    https://cdn.assets.taoidle.com/gh/github用户名/仓库名@分支
  2. 克隆 RandPicWorker 这个项目,在项目根目录下执行 yarn 打好依赖。然后使用以下命令登录 cloudflare

    yarn run wrangler login
  3. 在 cloudflare 上创建一个 kv namespace

  4. 填写项目里 wrangler.toml 文件缺少的信息

  5. 执行 package.json scripts 里的 publish 命令

  6. 随便写个脚本把图片信息丢上去完事 本来这里是有个 rust 写的程序的,用于将图片转为 webp 然后把 hash 值和路径丢到 worker 上,但是由于目前比较忙,有空再写

# 结束语

代码过于简单没啥好说的,好久没写博客了上来水一篇


端午假期稍微更新了一下