目录
[RedisXsync:一款同步/异步统一的 Redis 客户端,专为分布式锁与限流而生 🚀](#RedisXsync:一款同步/异步统一的 Redis 客户端,专为分布式锁与限流而生 🚀)
[📌 一、什么是 RedisXsync?](#📌 一、什么是 RedisXsync?)
[✨ 二、核心特性](#✨ 二、核心特性)
[🏗 三、整体架构](#🏗 三、整体架构)
[📦 四、安装](#📦 四、安装)
[🚀 五、快速上手](#🚀 五、快速上手)
[1️⃣ 注册 Redis 实例](#1️⃣ 注册 Redis 实例)
[📌 使用方式说明](#📌 使用方式说明)
[🔄 六、同步 / 异步统一用法](#🔄 六、同步 / 异步统一用法)
[✅ 同步写法](#✅ 同步写法)
[✅ 异步写法](#✅ 异步写法)
[🔐 七、分布式锁(支持组合锁)](#🔐 七、分布式锁(支持组合锁))
[示例(线程 + 协程混用)](#示例(线程 + 协程混用))
[🚦 八、爬虫账号池限流(核心亮点🔥)](#🚦 八、爬虫账号池限流(核心亮点🔥))
[📦 数据模型:LimitedModel](#📦 数据模型:LimitedModel)
[🧪 生产者:写入账号](#🧪 生产者:写入账号)
[🧲 消费者:获取账号(阻塞等待)](#🧲 消费者:获取账号(阻塞等待))
[🧩 同步版本](#🧩 同步版本)
[⚡ 工作机制](#⚡ 工作机制)
[🧠 九、设计亮点](#🧠 九、设计亮点)
[🔐 分布式锁](#🔐 分布式锁)
[🚦 限流系统](#🚦 限流系统)
[⚠️ 十、注意事项](#⚠️ 十、注意事项)
[Windows 用户](#Windows 用户)
[🧩 Redis 版本支持说明](#🧩 Redis 版本支持说明)
[⚠️ 实践建议](#⚠️ 实践建议)
[📌 特别说明](#📌 特别说明)
[📌 十一、适用场景](#📌 十一、适用场景)
[🎯 总结](#🎯 总结)
[🤝 最后](#🤝 最后)
本次开源项目:RedisXsync
https://github.com/jaygarage/RedisXsync
https://github.com/jaygarage/RedisXsync
RedisXsync:一款同步/异步统一的 Redis 客户端,专为分布式锁与限流而生 🚀
在实际开发中,我们经常会遇到这些问题:
- 同一项目中既有同步代码,又有异步代码,Redis 客户端难以统一
- 分布式环境下如何实现可靠的锁机制?
- 爬虫或接口调用如何优雅地做账号池限流?
- 多线程 + 协程混用时,如何保证安全性?
如果你也被这些问题困扰,那么 RedisXsync 可能正是你需要的解决方案。
📌 一、什么是 RedisXsync?
RedisXsync 是一个 同步 / 异步统一的 Redis 客户端库,专门为以下场景设计:
- 分布式锁
- 爬虫账号池限流
- 多实例 / 多 DB 管理
- 线程 & 协程安全
它最大的亮点在于:一套 API,同时支持同步和异步调用。
✨ 二、核心特性
|-------------|------------------------------------|
| 特性 | 描述 |
| 同步 / 异步统一接口 | 同一套 API 同时支持 with 和 async with |
| 多实例 / 多 DB | 支持多个 Redis 实例、多个数据库 |
| 分布式锁 | 支持单键锁、组合锁、阻塞模式 |
| 限流模型 | 基于 Lua 实现高精度令牌桶 |
| 线程 & 协程安全 | 天然支持并发安全 |
| 自动连接管理 | 使用 context manager 自动释放 |
🏗 三、整体架构
RedisXsync
├── Sync / Async Interfaces
├── Distributed Lock Manager
└── Rate Limiter / TokenPool
核心能力:
- 🔐 分布式锁:支持多 key 原子加锁
- 🚦 限流系统:基于 Lua 保证跨进程原子性
📦 四、安装
pip install redis-xsync
🚀 五、快速上手
1️⃣ 注册 Redis 实例
from redis_xsync import register_redis, resolve_redis, redisXsync
# 注册 Redis
redis1 = register_redis(
label="redis_xsync",
host="127.0.0.1",
port=6379,
db=0,
password=None,
decode_responses=True
)
# 根据 label 获取
redis2 = resolve_redis("redis_xsync")
📌 使用方式说明
# 1️⃣ 全局默认实例 redisXsync
# 首次 register 会自动赋值(非并发安全)
# 2️⃣ label 管理实例
# register_redis + resolve_redis
# 3️⃣ 独立实例
# RedisXsync() 手动创建
🔄 六、同步 / 异步统一用法
✅ 同步写法
with redis1(db=1) as r:
r.setnx("key", "value")
print(r.get("key"))
✅ 异步写法
import asyncio
async def main():
async with redis1(db=1) as r:
await r.setnx("key", "value")
print(await r.get("key"))
asyncio.run(main())
👉 重点:API 完全一致,仅需切换 with / async with
🔐 七、分布式锁(支持组合锁)
特性
- 多 key 原子锁
- 全部 key 成功才算加锁
- 支持阻塞等待
示例(线程 + 协程混用)
import threading
import asyncio
from redis_xsync import register_redis
cx = 0
redis = register_redis(label="redis_xsync", host="127.0.0.1", port=6379)
Lock = redis.AsyncRedisAtomicMultiLock
def sync_worker():
global cx
for _ in range(5):
with Lock("lock_key", db=0, ttl_ms=10, blocking=True):
with redis(db=2) as r:
r.setnx("db2", str(cx))
cx += 1
print(f"[SYNC] {cx=}")
async def async_worker():
global cx
for _ in range(5):
with Lock("lock_key", db=0, ttl_ms=10, blocking=True):
async with redis(db=3) as r:
await r.setnx("db3", str(cx))
cx += 1
print(f"[ASYNC] {cx=}")
await asyncio.sleep(0.2)
threading.Thread(target=sync_worker).start()
asyncio.run(async_worker())
🚦 八、爬虫账号池限流(核心亮点🔥)
RedisXsync 提供一个非常强大的能力:
👉 分布式账号池 + 限流 + 自动等待
📦 数据模型:LimitedModel
from redis_xsync.rtypes import LimitedModel
字段说明:
|---------------------|--------|
| 字段 | 说明 |
| id | 唯一标识 |
| ttl_ms | 过期时间 |
| interval_ms | 访问间隔 |
| next_time_available | 下次可用时间 |
| usage_count | 使用次数 |
🧪 生产者:写入账号
import random
from redis_xsync import register_redis
from redis_xsync.rtypes import LimitedModel
redis = register_redis(label="redis_xsync", host="127.0.0.1", port=6379)
Limited = redis.Limited
async def produce_container():
async with Limited(redis_key="crawler:identity:flow_limit") as lt:
for i in range(10):
token = LimitedModel(
id=f"user_{i}",
ttl_ms=random.randint(30000, 60000),
interval_ms=random.randint(1000, 6000),
containers="cookies"
)
await lt.set_available_containers(token)
🧲 消费者:获取账号(阻塞等待)
async def consume_token():
async with Limited(redis_key="crawler:identity:flow_limit") as lt:
token = await lt.wait_ask_available_containers(quantity=1, timeout=10)
print("获取到账号:", token)
🧩 同步版本
def consume_sync():
with Limited(redis_key="crawler:identity:flow_limit") as lt:
token = lt.wait_ask_available_containers(quantity=1, timeout=10)
print("获取到账号:", token)
⚡ 工作机制
- 生产者写入账号(带 TTL + 间隔)
- 消费者获取账号
- 若不可用 → 自动等待
- Lua 保证原子性
👉 真正实现:跨进程 / 跨机器限流
🧠 九、设计亮点
🔐 分布式锁
- Redis 原子操作实现
- 支持组合锁
- 防止并发冲突
🚦 限流系统
- 每个 token 独立控制
- 支持毫秒级精度
- Lua 脚本保证一致性
⚠️ 十、注意事项
Windows 用户
import asyncio
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
🧩 Redis 版本支持说明
RedisXsync 本身基于标准 Redis 协议(RESP),理论上兼容绝大多数 Redis 版本(6.x / 7.x / 8.x),但在实际使用中建议注意以下几点:
- ✅ 推荐版本:Redis ≥ 6.0
- 🚀 最佳体验:Redis 7.x 及以上
- ❌ 不建议使用过旧版本(如 Redis 5 及以下)
原因:
- 官方支持策略
- Redis 官方仅对较新的主版本提供持续支持与更新,旧版本会逐步进入 EOL(停止维护)
- 功能兼容性
- 新版本(如 Redis 7.x / 8.x)在性能、命令支持、Lua 脚本执行等方面更完善
- 限流 & Lua 脚本依赖
- RedisXsync 的限流模型 heavily 依赖 Lua 原子操作
- 老版本 Redis 在脚本执行性能和特性上存在限制
⚠️ 实践建议
✔ 推荐组合:
Redis 7.x + RedisXsync ← 最稳定
✔ 可用组合:
Redis 6.x + RedisXsync ← 兼容良好
❌ 不推荐:
Redis 5.x 及以下 ← 可能存在兼容或性能问题
📌 特别说明
- RedisXsync 不依赖 Redis Cluster 特性,单机 Redis 即可运行
- 若使用:
- 分布式锁 ✅
- 限流(Lua)✅
- 多实例管理 ✅
👉 建议统一使用较新 Redis 版本,避免隐性 bug
📌 十一、适用场景
RedisXsync 非常适合:
- 🕷 爬虫账号池
- 🚦 接口限流
- 🔐 分布式锁
- ⚙️ 多服务并发控制
- 📊 任务调度系统
🎯 总结
RedisXsync 解决了几个非常关键的问题:
✅ 同步 / 异步统一
✅ 分布式锁简单可靠
✅ 限流模型强大灵活
✅ 支持高并发场景
如果你的项目中:
- 既有同步又有异步代码
- 需要分布式锁
- 或需要做账号池 / 限流
那么它值得一试 👍
🤝 最后
欢迎大家:
- 提 Issue
- 提 PR
- 交流使用场景
一起把这个项目打磨得更好 🚀