# 前言

为了提高博客在国内的访问速度,于是决定做一个部署在国内的随机图 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"
  }

更新数据时步骤如下

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

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

  3. 全部待更新数据添加到待更新表后,更新索引数据,最后把所有更新的数据写入到 kv 中

# 步骤

  1. 又拍云 创建存储桶,绑定自定义域名,把资源上传到又拍云的存储桶中。在又拍云联盟加入开发者帮助计划,申请免费的云存储空间和 CDN 流量。

  2. 在 leancloud 国内版创建一个应用。

  3. 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 数据存储中的分表

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

# 结束语

其实就是前文 使用 cloudflare 和 jsdelivr 做一个随机图 api 的腾讯云函数偷懒实现版本,并没有对使用的资源做任何优化。后续有空优化一下,反正目前对我来说够用。