modify: 清除diskcache依赖
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# chongming-cache
|
||||
|
||||
统一缓存封装,dict-like 接口,后端可切换 **diskcache** / **redis**,通过配置一行切换,业务代码零改动。
|
||||
统一缓存封装,dict-like 接口,后端可切换 **sqlite**(本机)/ **redis**(跨主机),通过配置一行切换,业务代码零改动。
|
||||
|
||||
---
|
||||
|
||||
@@ -24,11 +24,12 @@ from chongming_cache import Cache
|
||||
cache = Cache.from_config(config["cache"])
|
||||
|
||||
# 方式二:显式参数
|
||||
cache = Cache("diskcache", cache_store_path="./cache_data")
|
||||
cache = Cache("sqlite", path="./cache_data/cache.db")
|
||||
# cache = Cache("redis", redis_host="127.0.0.1", redis_port=6379, redis_prefix="chongming:")
|
||||
# 历史后端名 "diskcache" 兼容映射为 sqlite
|
||||
```
|
||||
|
||||
### 映射协议(与 diskcache 用法一致)
|
||||
### 映射协议(与 dict / diskcache 用法一致)
|
||||
|
||||
```python
|
||||
cache["key"] = {"a": 1} # 写入(无 TTL)
|
||||
@@ -51,7 +52,7 @@ cache.close() # 释放连接
|
||||
|
||||
with Cache.from_config(cfg) as cache: ... # 上下文管理器,退出自动 close
|
||||
|
||||
cache.client # 底层客户端逃生口(diskcache.Cache / redis.Redis)
|
||||
cache.client # 底层客户端逃生口(sqlite3.Connection / redis.Redis)
|
||||
|
||||
# 原子写(分布式锁原语):仅当 key 不存在时写入,成功返回 True,已存在返回 False,不覆盖
|
||||
ok = cache.backend.set_nx("leader", {"node": "gw-1"}, expire=30)
|
||||
@@ -85,7 +86,7 @@ asyncio.run(main())
|
||||
- `acquire()`:SET NX,原子地仅在不存在时写入;key 带 TTL 租约,持有方宕机后到期自动让出,不会死锁。
|
||||
- `start()` / `stop()`:后台续约任务;续约前校验 token,仅在自己仍持有时 `touch`,锁丢失即停止续约。
|
||||
- `release()`:受保护释放——仅当 token 仍匹配(仍是自己持有)才删除,绝不误删其他进程/主机抢到的锁。
|
||||
- **后端适用性**:`redis` 真正跨主机共享;`diskcache` 进程安全(SQLite),可用于单机多进程或共享卷场景,不可跨无共享文件系统的主机。
|
||||
- **后端适用性**:`redis` 真正跨主机共享;`sqlite` 基于共享文件(SQLite 多进程安全),可用于单机多进程或共享卷场景,不可跨无共享文件系统的主机。
|
||||
|
||||
---
|
||||
|
||||
@@ -93,8 +94,8 @@ asyncio.run(main())
|
||||
|
||||
```toml
|
||||
[cache]
|
||||
backend = "diskcache" # "diskcache"(默认) | "redis"
|
||||
cache_store_path = "./cache_data"
|
||||
backend = "sqlite" # "sqlite"(默认,本机共享) | "redis"(跨主机)
|
||||
path = "./cache_data/cache.db" # 兼容旧键 cache_store_path(指向目录时自动追加 cache.db)
|
||||
|
||||
# redis 后端专用(backend = "redis" 时生效,均有默认值)
|
||||
# redis_host = "127.0.0.1"
|
||||
@@ -104,22 +105,29 @@ cache_store_path = "./cache_data"
|
||||
# redis_prefix = "chongming:"
|
||||
```
|
||||
|
||||
所有键均可缺省:旧配置(只有 `cache_store_path`)自动按 diskcache 后端工作。
|
||||
所有键均可缺省:旧配置(只有 `cache_store_path`)自动按 sqlite 后端工作。
|
||||
|
||||
---
|
||||
|
||||
## 双后端语义对齐
|
||||
|
||||
| 行为 | diskcache | redis |
|
||||
| ---- | --------- | ----- |
|
||||
| 值序列化 | pickle | pickle(保持任意 Python 对象语义一致) |
|
||||
| 行为 | sqlite(本机) | redis(跨主机) |
|
||||
| ---- | ----------- | ----------- |
|
||||
| 值序列化 | JSON(orjson) | JSON(orjson)(与 Rust 进程插件 serde_json 互通) |
|
||||
| 未命中 `cache[key]` | `KeyError` | `KeyError` |
|
||||
| `set(..., expire=N)` | 秒级 TTL,读时惰性淘汰 | `SET EX N`,到期即消失 |
|
||||
| `touch(未命中)` | 返回 False | 返回 False |
|
||||
| `clear()` | 清空本地缓存 | 仅清 `redis_prefix` 命名空间(不 flushdb) |
|
||||
| 多进程安全 | 是(SQLite + 锁) | 是(服务端原子性) |
|
||||
| 多进程安全 | 是(SQLite 文件 + WAL) | 是(服务端原子性) |
|
||||
|
||||
## 跨语言共享(Rust 插件 / sqlite)
|
||||
|
||||
sqlite 后端把值以 JSON 文本存进表 `cache(k TEXT PRIMARY KEY, v TEXT NOT NULL, expire REAL)`,
|
||||
schema 与 Rust 进程插件(`chongming-worker-rs`,feature `local-cache`)完全一致——Python 与
|
||||
Rust 读写**同一份 `.db` 文件**即可互通,无需 Redis。Rust 侧读侧不改变该 schema。
|
||||
|
||||
## 依赖
|
||||
|
||||
- `diskcache` — 本地持久化后端
|
||||
- `redis` — 远程后端(懒加载,diskcache-only 打包产物不引入)
|
||||
- `sqlite3` — 本地共享后端(Python 标准库,零第三方依赖)
|
||||
- `redis` — 远程后端(懒加载,仅选择 redis 后端时才 import)
|
||||
- `orjson` — 全后端统一 JSON 序列化(缺失时回退标准库 `json`)
|
||||
Reference in New Issue
Block a user