搭建一个 Key-Value(KV)库可以从“简单内存版”逐步演进到“支持持久化、并发、分布式”的版本。下面我按由浅入深的方式,给你一套可落地的思路和示例。
put(key, value)get(key)delete(key)class KVStore:
def __init__(self):
self.data = {}
def put(self, key, value):
self.data[key] = value
def get(self, key):
return self.data.get(key)
def delete(self, key):
if key in self.data:
del self.data[key]
✅ 优点:简单
❌ 缺点:进程退出数据丢失
import json
class KVStore:
def __init__(self, path="kv.json"):
self.path = path
self.data = self._load()
def _load(self):
try:
with open(self.path, "r") as f:
return json.load(f)
except FileNotFoundError:
return {}
def save(self):
with open(self.path, "w") as f:
json.dump(self.data, f)
def put(self, key, value):
self.data[key] = value
self.save()
def get(self, key):
return self.data.get(key)
✅ 易理解
❌ 性能差,不适合高频写
| 存储引擎 | 特点 |
|---|---|
| LevelDB | LSM Tree,写快 |
| RocksDB | LevelDB 增强版 |
| BoltDB | B+Tree,读友好 |
| Badger | Go 实现,LSM |
import rocksdb
db = rocksdb.DB("test.db", rocksdb.Options(create_if_missing=True))
db.put(b"name", b"Alice")
print(db.get(b"name"))
import threading
class KVStore:
def __init__(self):
self.data = {}
self.lock = threading.RLock()
def put(self, key, value):
with self.lock:
self.data[key] = value
def get(self, key):
with self.lock:
return self.data.get(key)
Client → Server → KV Engine
import socket, threading
def handle(conn):
while True:
cmd = conn.recv(1024).decode()
if not cmd: break
key, value = cmd.split(":")
kv.put(key, value)
conn.send(b"OK")
server = socket.socket()
server.bind(("0.0.0.0", 6379))
server.listen()
while True:
conn, _ = server.accept()
threading.Thread(target=handle, args=(conn,)).start()
如果你要认真做一个 KV 库,需要考虑:
如果你愿意,我可以:
你更想用哪种方式继续?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。