using NewLife.Caching;
using NewLife.Log;
XTrace.UseConsole();
var rds = new FullRedis("127.0.0.1:6379", "pass", 7)
{
Log = XTrace.Log,
ClientLog = XTrace.Log, // 调试阶段打开
AutoPipeline = 100 // 达到阈值自动提交管道
};
rds.Set("user:1", new { Name = "Alice", Time = DateTime.Now }, 3600);
var user = rds.Get<String>("user:1");
Console.WriteLine(user);
基础用法
rds.Set("k1", 123, 600); // 设置并指定过期
var v = rds.Get<Int32>("k1");
var ok = rds.Add("k2", "init"); // 仅在不存在时写入
var old = rds.Replace("k2", "new");
rds.Increment("counter", 1);
rds.Decrement("counter", 2);
过期管理:SetExpire(key, TimeSpan) 与 GetExpire(key)。
批量与集合操作
rds.SetAll(new Dictionary<String,Object>{{"a",1},{"b",2},{"c",3}}, 300);
var dict = rds.GetAll<Int32>(new[]{"a","b","c"});
泛型集合:
var list = rds.GetList<String>("queue:demo");
list.Add("job1");
var first = list[0];
注意:基础 Redis 实例仅支持字符串类操作,高级集合请实例化 FullRedis。
管道 Pipeline 与自动合并
场景:减少 RTT、提升批量操作吞吐。
var client = rds.StartPipeline();
for (var i = 0; i < 1000; i++) rds.Set(quot;p:{i}", i);
var results = rds.StopPipeline(); // results 为命令返回集合
利用 List + RPOPLPUSH / BRPOPLPUSH 保障“取出-处理中-确认”原子性:
var src = rds.GetList<String>("jobs:ready");
var bak = rds.GetList<String>("jobs:working");
var job = src.RPOPLPUSH(bak.Key); // 取出放入备份队列
// 处理成功后从备份列表删除
bak.Remove(job);
NewLife.Redis - 高性能 Redis 客户端组件
[English]
NewLife.Redis是新生命团队打造的 高性能 / 高吞吐 / 易集成 的 Redis 客户端,核心目标:支撑实时计算、海量缓存、可靠消息、分布式基础设施等场景。组件自 2017 年起在多个千万 / 百亿级数据与高并发生产平台稳定运行,经受日均 80+ 亿次 调用考验。目录
核心特性
GetAll/SetAll/ 管道聚合显著降低 RTTITracer(APM 链路),可插入性能计数器PerfCounter架构与模块划分
关键类说明:
Redis:核心客户端,提供协议管线、连接复用、自动管道、批量操作、性能统计、重试与故障转移。RedisClient:底层连接与 RESP 命令执行单元(内部对象,池化管理)。FullRedis:在Redis基础上追加更丰富数据结构及更高级场景能力。RedisList<T>/RedisHash<T>等:对 Redis 原生命令进行泛型包装,统一编码与序列化策略。IPacketEncoder:编解码策略,可切换 JSON / 二进制。对比说明
安装与快速开始
NuGet:
NewLife.Redis示例(推荐单例,线程安全):
基础用法
过期管理:
SetExpire(key, TimeSpan)与GetExpire(key)。批量与集合操作
泛型集合:
管道 Pipeline 与自动合并
场景:减少 RTT、提升批量操作吞吐。
自动模式:设置
AutoPipeline = 100后,写操作累积到阈值自动提交;FullPipeline = true时读请求也进入管道。消息 / 队列 / 可靠消费
利用 List +
RPOPLPUSH/BRPOPLPUSH保障“取出-处理中-确认”原子性:阻塞获取:
BRPOPLPUSH(destKey, timeoutSeconds),timeout=0 表示永久阻塞。序列化与编码器
默认编码:
RedisJsonEncoder(内置 JSON 主机)。可通过实现IPacketEncoder定制二进制格式以减少内存与网络:如需共享 JSON 配置或自定义时间/数字格式,可设置:
rds.JsonHost = RedisJsonEncoder.GetJsonHost();性能测试参考
源码内置 Benchmark(
Redis.Bench),典型结果(40 逻辑处理器,批量优化):可执行:
最佳实践与经验
GetAll/SetAll不循环单键;利用管道降低往返RPOPLPUSH+ 备份列表手动确认Counter/Tracer仅在需要时,避免热路径开销多实例 & 高可用策略
Server可配置:"10.0.1.10:6379,10.0.1.11:6379"。ShieldingTime控制不可用节点屏蔽窗口扩展包 (Extensions)
NewLife.Redis.Extensions提供 ASP.NET Core 集成:IDistributedCache后端实现IDataProtection密钥存储安装:
示例:
与 MemoryCache 的协同
建议以
ICache编程:小数据或临时热点 →MemoryCache;规模上升/跨进程共享 → 切换Redis/FullRedis,无须修改业务逻辑。常见问题 FAQ
Q: 是否支持发布订阅 / Stream / Cluster?
A: 基础代码已具备扩展点,发布订阅/更多结构可在 FullRedis 扩展层或后续版本完善。Cluster 分片可通过多实例 + Key 路由策略实现。
Q: 如何处理反序列化失败?
A:
TryGetValue返回是否存在键,即使反序列化失败仍可感知,用于容错与告警。Q: 如何降低大 Value 带来的慢查询?
A: 拆分结构 + 批量 + 二进制编码 + 控制
MaxMessageSize(默认 1MB)。路线图 Roadmap
欢迎通过 Issue / PR 参与投票或补充需求。
新生命项目矩阵
(节选) | 项目 | 说明 | | —- | —- | | NewLife.Core | 核心库,日志/配置/缓存/序列化/APM | | NewLife.XCode | 大数据 ORM,百亿级 + 分表 + 读写分离 | | NewLife.Net | 超高性能网络库(千万级吞吐) | | Stardust | 分布式服务/配置/注册/发布中心 | | AntJob | 分布式计算 & 调度平台 | | NewLife.RocketMQ | RocketMQ 纯托管客户端 | | … | 更多见官网与组织首页 |
贡献指南 & 社区
.github/copilot-instructions.md(编码规范 & 审核清单)社区:QQ群 1600800 / 1600838 ;GitHub Discussions / Issues 参与答疑。
许可证
MIT License。可自由商用 / 修改 / 再发行(无需额外授权)。保留版权声明即可。
新生命开发团队
团队自 2002 年迄今,维护 80+ .NET / IoT / 分布式相关开源项目,NuGet 累计下载超 400 万。产品与组件已广泛服务于电力、物流、工业控制、教育、通信、文博等行业。
网站:https://newlifex.com | 开源:https://github.com/NewLifeX
微信公众号: