using NewLife.Caching;
using NewLife.Log;
XTrace.UseConsole();
var rds = new FullRedis("127.0.0.1:6379", "password", 0)
{
Log = XTrace.Log, // 可选:组件日志
AutoPipeline = 100, // 可选:命令数达到 100 自动提交管道
};
// 写入对象(自动 JSON 序列化)
rds.Set("user:1", new { Name = "Alice", Age = 30 }, expire: 3600);
// 读取(自动反序列化)
var name = rds.Get<String>("user:1");
Console.WriteLine(name);
连接字符串模式(推荐配置中心):
var rds = FullRedis.Create("server=127.0.0.1:6379;password=pass;db=0;timeout=3000");
基础用法
// 写入 / 读取
rds.Set("k1", 123, expire: 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);
// 过期管理
rds.SetExpire("k1", TimeSpan.FromMinutes(10));
var ttl = rds.GetExpire("k1");
// 批量读写
rds.SetAll(new Dictionary<String, Object> { ["a"] = 1, ["b"] = 2 }, expire: 300);
var dict = rds.GetAll<Int32>(["a", "b"]);
// 键前缀(PrefixedRedis)
var scoped = rds.GetPrefixed("myapp:");
scoped.Set("user", "Alice"); // 实际 key 为 myapp:user
数据结构操作
List(列表)
var list = rds.GetList<String>("queue:demo");
list.Add("job1");
list.Add("job2");
var first = list[0];
var popped = list.RightPop();
Hash(哈希)
var hash = rds.GetDictionary<String>("user:1001");
hash["Name"] = "Alice";
hash["Email"] = "alice@example.com";
var name = hash["Name"];
var all = hash.GetAll();
Set(集合)/ SortedSet(有序集合)
var set = rds.GetSet<String>("tags");
set.Add("redis");
set.Add("cache");
var contains = set.Contains("redis");
var zset = rds.GetSortedSet<String>("leaderboard");
zset.Add("Player1", 100.0);
zset.Add("Player2", 95.5);
var top3 = zset.GetByRank(0, 2);
Stack(栈)
var stack = rds.GetStack<String>("undo:ops");
stack.Push("op1");
stack.Push("op2");
var last = stack.Pop(); // "op2"
Geo(地理信息)
var geo = rds.GetGeo("locations");
geo.Add("Beijing", 116.4074, 39.9042);
geo.Add("Shanghai", 121.4737, 31.2304);
var dist = geo.GetDistance("Beijing", "Shanghai", "km");
var nearby = geo.Search("Beijing", 500, "km");
HyperLogLog(基数统计)
var hll = rds.GetHyperLogLog("uv:today");
hll.Add("user1", "user2", "user3");
var count = hll.Count; // 近似基数
hll.Merge("uv:yesterday");
注意:基础 Redis 实例仅支持 KV 操作,高级集合请使用 FullRedis。
管道 Pipeline 与自动合并
Pipeline 可显著降低网络往返(RTT),提升批量操作吞吐:
// 显式管道
rds.StartPipeline();
for (var i = 0; i < 1000; i++) rds.Set($"p:{i}", i);
var results = rds.StopPipeline(true);
NewLife.Redis - 高性能 Redis 客户端组件
[English]
NewLife.Redis是新生命团队打造的高性能 / 高吞吐 / 易集成的 .NET Redis 客户端组件。自 2017 年起在多个千万 / 百亿级数据与高并发生产平台稳定运行,经受日均 80+ 亿次命令调用考验。目录
产品介绍
NewLife.Redis 为 .NET 开发者提供对 Redis 全生命周期的访问能力:
核心特性
ITracer链路追踪 +PerfCounter性能计数器Redis 协议与版本支持
RESP 协议支持
Redis 版本特性支持
架构与模块划分
关键类说明:
RedisFullRedisRedisClientRedisList<T>等RedisReliableQueue<T>RedisStream<T>IPacketEncoder安装与快速开始
推荐单例,线程安全,全程复用:
连接字符串模式(推荐配置中心):
基础用法
数据结构操作
List(列表)
Hash(哈希)
Set(集合)/ SortedSet(有序集合)
Stack(栈)
Geo(地理信息)
HyperLogLog(基数统计)
管道 Pipeline 与自动合并
Pipeline 可显著降低网络往返(RTT),提升批量操作吞吐:
自动模式(推荐生产使用):
消息队列
简单队列
可靠队列(至少一次语义)
延迟队列
Stream 流队列(Redis 5.0+,多消费组)
发布订阅
集群与高可用
多地址自动切换
自动集群模式检测
云厂商适配
阿里云 KVStore / Tair
腾讯云 Redis
华为云 DCS
云厂商通用注意事项:
AutoDetect = false(默认值),不让客户端自动探测内网节点Max参数Timeout小于此值并定期 PING序列化与编码器
默认编码:
RedisJsonEncoder(内置 JSON 主机),开箱即用。基元类型(
String/Int32/Int64/Double/Boolean)直接序列化,不经 JSON,性能最优。安全与认证
可观测性
扩展包
NewLife.Redis.Extensions提供 ASP.NET Core 深度集成:Garnet 兼容性
NewLife.Redis 完整支持微软的 Garnet 高性能 Redis 兼容服务器,自动检测并优雅降级。
RedisQueue<T>/RedisDelayQueue<T>RedisReliableQueue<T>RedisStream<T>NotSupportedException并提示替代方案详见:Garnet 兼容性文档
功能拆分与完成情况
数据结构
消息队列
RedisQueue<T>RedisReliableQueue<T>RedisDelayQueue<T>RedisStream<T>MultipleConsumerGroupsQueue<T>PubSub+RedisEventBus集群支持
协议与高级特性
性能测试参考
源码内置 Benchmark(
Samples/Benchmark),典型结果(40 逻辑处理器,本地 Redis 7.0):手动触发 Bench:
最佳实践
FullRedis内部有连接池,强烈建议单例供全程使用,不要每次new:分层,如user:1001:profile;生产环境使用Prefix隔离命名空间GetAll/SetAll不循环单键;利用AutoPipeline自动合并写操作RedisReliableQueue<T>而非简单 List,避免消息丢失AutoDetect = false,避免内网节点地址问题Counter统计;ClientLog仅调试时打开,避免热路径日志开销常见问题 FAQ
Q: 是否支持 Redis Cluster 分片?
A: 支持。
FullRedis通过AutoDetect=true自动识别 Cluster 模式,CRC16 路由、MOVED/ASK 重定向均已实现。公有云代理模式建议保持默认AutoDetect=false。Q: 和 StackExchange.Redis 相比有什么区别?
A: NewLife.Redis 采用连接池模型(对比 StackExchange 的多路复用),连接行为更直观;内置消息队列封装(可靠队列/延迟队列)是核心差异化;支持 .NET Framework 4.5。详见 竞品分析。
Q: 如何处理大 Value 导致的慢查询?
A: 拆分数据结构(如 Hash 分字段)+ 批量读写 + 二进制编码器 + 控制
MaxMessageSize(默认 1MB 上限)。Q: 连接池用完了怎么办?
A: 默认最大 100,000 连接,正常业务不会耗尽。若出现等待超时,检查是否有连接泄漏(未
Dispose)或某些操作持续长时间占用。Q: 使用阿里云 / 腾讯云为什么连接失败?
A: 检查:①
AutoDetect是否为 false(默认正确);② 认证格式是否正确(腾讯云需要username=instanceId);③ 网络安全组 / 白名单是否放开客户端 IP;④ 集群版是否禁止使用 SELECT 切库。Q: Garnet 服务器是否支持所有功能?
A: 基础操作、List/Hash/Set/ZSet/HLL/Geo/队列均支持;Stream 暂不支持,会自动抛出
NotSupportedException并提示用RedisQueue<T>替代。路线图 Roadmap
发布订阅 PubSub(已完成)RedisStream 多消费组(已完成)Garnet 服务器类型检测(已完成)欢迎通过 Issue / PR 参与投票或补充需求。
竞品对比
详细分析见 竞品分析文档。
新生命项目矩阵
贡献指南 & 社区
.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
微信公众号: