6.5840 Lab-Key/Value Server 思路

6.824 Lab 2: Key/Value Server

在本实验中,需要构建一个键/值服务器, 以确保每个操作在网络故障 的情况下都只执行一次, 并且操作是线性化的。

网络故障

示例代码

Go 复制代码
type Clerk struct {
	server   *labrpc.ClientEnd
	workerId int64
	seq      int64
}
Go 复制代码
func (ck *Clerk) PutAppend(key string, value string, op string) string {
	reply := new(PutAppendReply)
	for !reply.Ok {
		ck.server.Call("KVServer."+op, &PutAppendArgs{key, value, ck.workerId, ck.seq}, reply)
	}
	ck.seq++
	v := reply.Value
	reply.Ok = false
	return v
}
Go 复制代码
type KVServer struct {
	mu sync.RWMutex

	m      map[string]string
	seqSet map[string]string
}
Go 复制代码
func (kv *KVServer) Append(args *PutAppendArgs, reply *PutAppendReply) {
	kv.mu.Lock()
	defer kv.mu.Unlock()
	
	key := strconv.Itoa(int(args.WorkerId)) + strconv.Itoa(int(args.Seq))
	//检查是不是执行过
	if v, ok := kv.seqSet[key]; ok {
		reply.Ok = true
		reply.Value = v
		return
	}
	//删除上一次的缓存
	delete(kv.seqSet, strconv.Itoa(int(args.WorkerId))+strconv.Itoa(int(args.Seq-1)))
	//执行Append
	s := kv.m[args.Key]
	kv.seqSet[key] = s
	kv.m[args.Key] = s + args.Value
	reply.Value = s
	reply.Ok = true
}

tips

  • 测试文件运行在linux下比windows快不少,建议在linux测试
相关推荐
mantou13233 分钟前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端
程序员老赵37 分钟前
Docker 部署 DeepSeek Harness:轻松搭建局域网里的 AI Agent 平台
后端·ai编程·deepseek
YIAN42 分钟前
实战|用 DeepSeek + SQLite 从零搭建轻量 Text2SQL 查询助手
后端·sqlite·deepseek
王中阳Go42 分钟前
自己摸了 2 个月零 offer,补底子只用了 3 块:Go 后端转 AI 最难的不是技术
后端·agent·ai编程
高频因子挖掘机1 小时前
第一次补历史行情:按股票拆,还是按日期拆请求?
后端·github·api
小园子的小菜1 小时前
Python协程深度解析:从原理演进到实战避坑
后端·python
高频因子挖掘机1 小时前
300 只股票 × 两年日 K:为什么逐只循环会变成维护灾难?
后端·github·api
苏三说技术2 小时前
Spring AI Alibaba已停更了,Java还有希望吗?
后端
松就是我902983 小时前
如何搭建一个 Agent 系统:方法论、理想形态与一次真实落地
后端
Layer3 小时前
即时通讯系统的关键设计
后端·架构