修复 1:parse_value_header 整数溢出 ✅ 正确 修复 2:quit 关闭失败吞掉 ✅ 正确
parse_value_header
quit
用 MoonBit 实现的 memcached 文本协议(text protocol)客户端库。
它只负责两件事:把命令编码成 memcached 能读懂的字节,把服务器返回的字节解码成结构化数据。 传输通道被抽象成一个 Connection trait,因此整个包不依赖任何 socket,可以在没有 memcached 服务端的环境下完整地编码、解码与测试。
Connection
lexchb/memcached
0.2.0
wasm-gc
moonbitlang/core
buffer
debug
encoding/utf8
string
模块已发布到 mooncakes.io:lexchb/memcached, 在模块目录里用包管理器添加即可:
moon add lexchb/memcached
本包不引入任何第三方依赖,因此在没有 memcached 服务端、也没有网络的环境里同样可以构建、 测试与运行示例。
传输通道由使用方实现 Connection;包内自带的内存实现 ScriptedConnection 让下面的最小 样例不需要 socket 就能跑通:
ScriptedConnection
// 内存转录:服务器依次回答 STORED 与一个 VALUE 块。 let conn = @memcached.ScriptedConnection::new([ b"STORED\r\n", b"VALUE foo 0 3\r\nbar\r\nEND\r\n", ]) let client = @memcached.Client::new(conn) println(client.set("foo", b"bar")) // Status::Stored for value in client.get(["foo"]) { println(value.key) // foo println(value.data) // b"bar" }
接真实网络时只需为 socket 实现同一个 Connection(read 在无数据时阻塞,返回空表示对端 已关闭),上面这段客户端代码不需要任何改动;超时、重连与连接池同样落在实现里。
read
仓库内自带一个可运行的演示程序,覆盖编码结果、单连接往返、管理命令、流水线与增量解码:
moon run cmd/main
set / add / replace / append / prepend / cas、get / gets、gat / gats、 delete、incr / decr、touch、version、stats [<section>]、flush_all、verbosity、 cache_memlimit、slabs reassign / slabs automove、quit;其中存储类命令、delete、 incr / decr、touch、flush_all、verbosity、cache_memlimit 与 slabs 系命令支持 noreply。另提供流水线批处理(Client::pipeline)与失步恢复(Client::resync)。
set
add
replace
append
prepend
cas
get
gets
gat
gats
delete
incr
decr
touch
version
stats [<section>]
flush_all
verbosity
cache_memlimit
slabs reassign
slabs automove
slabs
noreply
Client::pipeline
Client::resync
stats 只解得了返回 STAT 行的分节(stats cachedump 这类分节不在支持范围内),incr / decr 未命中会表现为协议错误而不是「未命中」,slabs 系命令只识别 OK 应答;这些边界与其余限制见 README.mbt.md 第十节「已知限制」。
stats
STAT
stats cachedump
OK
memcached.mbt
transport.mbt
client.mbt
Client
memcached_test.mbt
memcached_wbtest.mbt
cmd/main/main.mbt
README.mbt.md
moon check # 类型检查 moon fmt --check # 检查格式 moon build # 构建模块 moon test # 跑测试 moon run cmd/main # 跑演示程序
CI(.github/workflows/ci.yml)在每次 push 与 pull request 上依次执行 moon check、 moon build、moon test。
.github/workflows/ci.yml
moon check
moon build
moon test
仓库里另带一个 pre-commit 钩子(.githooks/pre-commit,依次跑 moon check、 moon fmt --check、moon test;格式检查只在这里做,不进入 CI)。克隆后执行一次即可让它在本地生效:
.githooks/pre-commit
moon fmt --check
git config core.hooksPath .githooks
本项目采用 Apache-2.0 许可证,全文见 LICENSE。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
lexchb/memcached
用 MoonBit 实现的 memcached 文本协议(text protocol)客户端库。
它只负责两件事:把命令编码成 memcached 能读懂的字节,把服务器返回的字节解码成结构化数据。 传输通道被抽象成一个
Connectiontrait,因此整个包不依赖任何 socket,可以在没有 memcached 服务端的环境下完整地编码、解码与测试。lexchb/memcached,版本0.2.0wasm-gcmoonbitlang/core的buffer、debug、encoding/utf8、string安装
模块已发布到 mooncakes.io:
lexchb/memcached, 在模块目录里用包管理器添加即可:本包不引入任何第三方依赖,因此在没有 memcached 服务端、也没有网络的环境里同样可以构建、 测试与运行示例。
快速开始
传输通道由使用方实现
Connection;包内自带的内存实现ScriptedConnection让下面的最小 样例不需要 socket 就能跑通:接真实网络时只需为 socket 实现同一个
Connection(read在无数据时阻塞,返回空表示对端 已关闭),上面这段客户端代码不需要任何改动;超时、重连与连接池同样落在实现里。仓库内自带一个可运行的演示程序,覆盖编码结果、单连接往返、管理命令、流水线与增量解码:
支持的命令
set/add/replace/append/prepend/cas、get/gets、gat/gats、delete、incr/decr、touch、version、stats [<section>]、flush_all、verbosity、cache_memlimit、slabs reassign/slabs automove、quit;其中存储类命令、delete、incr/decr、touch、flush_all、verbosity、cache_memlimit与slabs系命令支持noreply。另提供流水线批处理(Client::pipeline)与失步恢复(Client::resync)。stats只解得了返回STAT行的分节(stats cachedump这类分节不在支持范围内),incr/decr未命中会表现为协议错误而不是「未命中」,slabs系命令只识别OK应答;这些边界与其余限制见 README.mbt.md 第十节「已知限制」。项目结构
memcached.mbttransport.mbtConnectiontrait 与内存版ScriptedConnectionclient.mbtClient、请求校验、便捷命令方法memcached_test.mbtmemcached_wbtest.mbtcmd/main/main.mbtmoon run cmd/main)README.mbt.md开发与测试
CI(
.github/workflows/ci.yml)在每次 push 与 pull request 上依次执行moon check、moon build、moon test。仓库里另带一个 pre-commit 钩子(
.githooks/pre-commit,依次跑moon check、moon fmt --check、moon test;格式检查只在这里做,不进入 CI)。克隆后执行一次即可让它在本地生效:许可证
本项目采用 Apache-2.0 许可证,全文见 LICENSE。