Cloudflare最近在Workers的free plan中增加了KV存储, 使免费的Workers拥有了数据持久化功能, 可以实现更多的玩法. 比如说, 可以将KV存储功能作为近似的Redis使用, 搭建一个简单的键值对存储服务器.
在使用KV功能前, 需要先在KV管理页面创建Namespace, 并在需要使用到它的Workers 配置中增加Namespace的变量绑定.
假设我们创建了名为BUCKET
的Namespace并绑定到BUCKET
变量. 用这段Demo代码创建一个Worker.
LIST_PASSWD = "default_password"
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
url = new URL(request.url)
if (url.pathname === "/set") {
for(var key of url.searchParams.keys()) {
await BUCKET.put(key, url.searchParams.get(key))
}
return new Response("ok")
}
if (url.pathname === "/get") {
key = url.searchParams.get("key")
const value = await BUCKET.get(key)
return new Response(value)
}
if (url.pathname === "/list") {
const value = await BUCKET.list()
passwd = url.searchParams.get("passwd")
if (passwd !== LIST_PASSWD) {
return new Response("Password not correct", {status: 400})
}
let key_list = []
for(var key of value.keys) {
key_list.push(key.name)
}
return new Response(key_list.join("\r\n"))
}
}
能实现的功能有:
-
通过GET请求访问workers域名加path
/set
, 可以用url params的方式传参, 存储键值对到KV的指定Namespace中. 比如直接GET请求以下url:https://xxx.xxx.workers.dev/set?first=hello&last=world
可以将
first:hello
和last:world
两个键值对存进KV中, 返回200 OK. -
通过GET请求访问workers域名加path
/get
, 可以通过指定url参数key=xxxx
来查询KV中xxxx
这个key对应的value. 假设上一步已经存储了first
和last
这两个key, 那么GET请求以下url:https://xxx.xxx.workers.dev/get?key=first
可以获取到
first
这个key对应的value, 也就是hello
. -
通过GET请求访问workers域名加path
/list
, 可以列出当前使用的Namespace中已经存储的key. 这个接口较敏感, 代码中简单设定了一个密码鉴权, 也可以存储在workers环境变量或者自定义别的鉴权方法. GET以下url:https://xxx.xxx.workers.dev/list?passwd=default_password
可以返回当前已存储的key列表.
一个简单Demo仅作体验.
过去想实现一些自动化任务和小规模个人服务, 很多情况下都需要购买云服务器, 且需要具备一定Linux基础, 门槛不低. 现在Workers和KV的free plan已经相当够用, 简单的个人静态博客, todo-list, 反向代理, 以及定时任务都不在话下. 有空再探索一下更多玩法.