Redis 中文文档 Redis 中文文档
指南
redis.io (opens new window)
指南
redis.io (opens new window)
  • 关于
    • Redis 开源治理
    • Redis 发布周期
    • Redis 赞助商
  • 入门
  • 数据类型
  • Redis Stack
  • 命令
  • 手册

NewLife.Redis - Redis客户端组件


[English]


NewLife.Redis 是一个Redis客户端组件,以高性能处理大数据实时计算为目标。Redis协议基础实现Redis/RedisClient位于X组件 ,本库为扩展实现,主要增加列表结构、哈希结构、队列等高级功能。

源码: https://github.com/NewLifeX/NewLife.Redis Nuget:NewLife.Redis教程:https://newlifex.com/core/redis

特性


在ZTO大数据实时计算广泛应用,200多个Redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次
低延迟,Get/Set操作平均耗时200~600us(含往返网络通信)
大吞吐,自带连接池,最大支持1000并发
高性能,支持二进制序列化

Redis经验分享


在Linux上多实例部署,实例个数等于处理器个数,各实例最大内存直接为本机物理内存,避免单个实例内存撑爆
把海量数据(10亿+)根据key哈希(Crc16/Crc32)存放在多个实例上,读写性能成倍增长
采用二进制序列化,而非常见Json序列化
合理设计每一对Key的Value大小,包括但不限于使用批量获取,原则是让每次网络包控制在1.4k字节附近,减少通信次数
Redis客户端的Get/Set操作平均耗时200~600us(含往返网络通信),以此为参考评估网络环境和Redis客户端组件
使用管道Pipeline合并一批命令
Redis的主要性能瓶颈是序列化、网络带宽和内存大小,滥用时处理器也会达到瓶颈
其它可查优化技巧 以上经验,源自于300多个实例4T以上空间一年多稳定工作的经验,并按照重要程度排了先后顺序,可根据场景需要酌情采用!

基础 Redis


Redis实现标准协议以及基础字符串操作,完整实现由独立开源项目NewLife.Redis 提供。采取连接池加同步阻塞架构,具有超低延迟(200~600us)以及超高吞吐量的特点。在物流行业大数据实时计算中广泛应有,经过日均100亿次调用量验证。

  1. ``` cs
  2. // 实例化Redis,默认端口6379可以省略,密码有两种写法
  3. //var rds = new FullRedis("127.0.0.1", null, 7);
  4. var rds = new FullRedis("127.0.0.1:6379", "pass", 7);
  5. //var rds = new FullRedis();
  6. //rds.Init("server=127.0.0.1:6379;password=pass;db=7");
  7. rds.Log = XTrace.Log; // 调试日志。正式使用时注释
  8. ```

基本操作


在基本操作之前,我们先做一些准备工作:

新建控制台项目,并在入口函数开头加上 XTrace.UseConsole(); ,这是为了方便查看调试日志
具体测试代码之前,需要加上前面MemoryCache或Redis的实例化代码
准备一个模型类User

  1. ``` cs
  2. class User
  3. {
  4.     public String Name { get; set; }
  5.     public DateTime CreateTime { get; set; }
  6. }
  7. ```

添删改查:

  1. ``` cs
  2. var rds = new FullRedis("127.0.0.1", null, 7);
  3. var user = new User { Name = "NewLife", CreateTime = DateTime.Now };
  4. rds.Set("user", user, 3600);
  5. var user2 = rds.Get<User>("user");
  6. XTrace.WriteLine("Json: {0}", user2.ToJson());
  7. XTrace.WriteLine("Json: {0}", rds.Get<String>("user"));
  8. if (rds.ContainsKey("user")) XTrace.WriteLine("存在!");
  9. rds.Remove("user");
  10. ```

执行结果:

  1. ``` cs
  2. 14:14:25.990  1 N - SELECT 7
  3. 14:14:25.992  1 N - => OK
  4. 14:14:26.008  1 N - SETEX user 3600 [53]
  5. 14:14:26.021  1 N - => OK
  6. 14:14:26.042  1 N - GET user
  7. 14:14:26.048  1 N - => [53]
  8. 14:14:26.064  1 N - GET user
  9. 14:14:26.065  1 N - => [53]
  10. 14:14:26.066  1 N - Json: {"Name":"NewLife","CreateTime":"2018-09-25 14:14:25"}
  11. 14:14:26.067  1 N - EXISTS user
  12. 14:14:26.068  1 N - => 1
  13. 14:14:26.068  1 N - 存在!
  14. 14:14:26.069  1 N - DEL user
  15. 14:14:26.070  1 N - => 1
  16. ```

保存复杂对象时,默认采用Json序列化,所以上面可以按字符串把结果取回来,发现正是Json字符串。Redis的strings,实质上就是带有长度前缀的二进制数据,[53]表示一段53字节长度的二进制数据。

集合操作


GetAll/SetAll 在Redis上是很常用的批量操作,同时获取或设置多个key,一般有10倍以上吞吐量。

批量操作:

  1. ``` cs
  2. var rds = new FullRedis("127.0.0.1", null, 7);
  3. var dic = new Dictionary<String, Object>
  4. {
  5.     ["name"] = "NewLife",
  6.     ["time"] = DateTime.Now,
  7.     ["count"] = 1234
  8. };
  9. rds.SetAll(dic, 120);

  10. var vs = rds.GetAll<String>(dic.Keys);
  11. XTrace.WriteLine(vs.Join(",", e => $"{e.Key}={e.Value}"));
  12. ```

执行结果:

  1. ``` cs
  2. MSET name NewLife time 2018-09-25 15:56:26 count 1234
  3. => OK
  4. EXPIRE name 120
  5. EXPIRE time 120
  6. EXPIRE count 120
  7. MGET name time count
  8. name=NewLife,time=2018-09-25 15:56:26,count=1234
  9. ```

集合操作里面还有 GetList/GetDictionary/GetQueue/GetSet 四个类型集合,分别代表Redis的列表、哈希、队列、Set集合等。基础版Redis不支持这四个集合,完整版NewLife.Redis 支持,MemoryCache则直接支持。

高级操作


Add 添加,当key不存在时添加,已存在时返回false。
Replace 替换,替换已有值为新值,返回旧值。
Increment 累加,原子操作
Decrement 递减,原子操作

高级操作:

  1. ``` cs
  2. var rds = new FullRedis("127.0.0.1", null, 7);
  3. var flag = rds.Add("count", 5678);
  4. XTrace.WriteLine(flag ? "Add成功" : "Add失败");
  5. var ori = rds.Replace("count", 777);
  6. var count = rds.Get<Int32>("count");
  7. XTrace.WriteLine("count由{0}替换为{1}", ori, count);

  8. rds.Increment("count", 11);
  9. var count2 = rds.Decrement("count", 10);
  10. XTrace.WriteLine("count={0}", count2);
  11. ```

执行结果:

  1. ``` cs
  2. SETNX count 5678
  3. => 0
  4. Add失败
  5. GETSET count 777
  6. => 1234
  7. GET count
  8. => 777
  9. count由1234替换为777
  10. INCRBY count 11
  11. => 788
  12. DECRBY count 10
  13. => 778
  14. count=778
  15. ```

性能测试


Bench 会分根据线程数分多组进行添删改压力测试。rand 参数,是否随机产生key/value。batch 批大小,分批执行读写操作,借助GetAll/SetAll进行优化。

Redis默认设置AutoPipeline=100,无分批时打开管道操作,对添删改优化。

Redis的兄弟姐妹


Redis实现ICache接口,它的孪生兄弟MemoryCache,内存缓存,千万级吞吐率。各应用强烈建议使用ICache接口编码设计,小数据时使用MemoryCache实现;数据增大(10万)以后,改用Redis实现,不需要修改业务代码。

新生命项目矩阵


各项目默认支持net7.0/netstandard2.1/netstandard2.0/net4.61,旧版(2022.1225)支持net4.5/net4.0/net2.0

项目 年份 说明
:--- :--- :---
基础组件 支撑其它中间件以及产品项目
NewLife.Core 2002 核心库,日志、配置、缓存、网络、序列化、APM性能追踪
NewLife.XCode 2005 大数据中间件,单表百亿级,MySql/SQLite/SqlServer/Oracle/TDengine/达梦,自动分表
NewLife.Net 2005 网络库,单机千万级吞吐率(2266万tps),单机百万级连接(400万Tcp)
NewLife.Remoting 2011 RPC通信框架,内网高吞吐或物联网硬件设备场景
NewLife.Cube 2010 魔方快速开发平台,集成了用户权限、SSO登录、OAuth服务端等,单表100亿级项目验证
NewLife.Agent 2008 服务管理组件,把应用安装成为操作系统守护进程,Windows服务、Linux的Systemd
NewLife.Zero 2020 Zero零代脚手架,基于NewLife组件生态的项目模板,Web、WebApi、Service
中间件 对接知名中间件平台
NewLife.Redis 2017 Redis客户端,微秒级延迟,百万级吞吐,丰富的消息队列,百亿级数据量项目验证
NewLife.RocketMQ 2018 RocketMQ纯托管客户端,支持Apache RocketMQ和阿里云消息队列,十亿级项目验
NewLife.MQTT 2019 物联网消息协议,MqttClient/MqttServer,客户端支持阿里云物联网
NewLife.IoT 2022 IoT标准库,定义物联网领域的各种通信协议标准规范
NewLife.Modbus 2022 ModbusTcp/ModbusRTU/ModbusASCII,基于IoT标准库实现,支持IoT平台和IoTEdge
NewLife.Siemens 2022 西门子PLC协议,基于IoT标准库实现,支持IoT平台和IoTEdge
NewLife.Map 2022 地图组件库,封装百度地图、高德地图和腾讯地图
NewLife.IP 2022 IP地址库,IP地址转物理地址
产品平台 产品平台级,编译部署即用,个性化自定义
AntJob 2019 蚂蚁调度,分布式大数据计算平台(实时/离线),蚂蚁搬家分片思想,万亿级数据量项目验证
Stardust 2018 星尘,分布式服务平台,节点管理、APM监控中心、配置中心、注册中心、发布中心
NewLife.ERP 2021 企业ERP,产品管理、客户管理、销售管理、供应商管理
CrazyCoder 2006 码神工具,众多开发者工具,网络、串口、加解密、正则表达式、Modbus
XProxy 2005 产品级反向代理,NAT代理、Http代理
HttpMeter 2022 Http压力测试工具
GitCandy 2015 Git源代码管理系统
SmartOS 2014 嵌入式操作系统,完全独立自主,支持ARM Cortex-M芯片架构
SmartA2 2019 嵌入式工业计算机,物联网边缘网关,高性能.NET6主机,应用于工业、农业、交通、医疗
菲凡物联FIoT 2020 物联网整体解决方案,建筑、环保、农业,软硬件及大数据分析一体化,单机十万级点位项目验证
NewLife.UWB 2020 厘米级(10~20cm)高精度室内定位,软硬件一体化,与其它系统联动,大型展厅项目验证

新生命开发团队


新生命团队(NewLife)成立于2002年,是新时代物联网行业解决方案提供者,致力于提供软硬件应用方案咨询、系统架构规划与开发服务。团队主导的开源NewLife系列组件已被广泛应用于各行业,Nuget累计下载量高达60余万次。团队开发的大数据核心组件NewLife.XCode、蚂蚁调度计算平台AntJob、星尘分布式平台Stardust、缓存队列组件NewLife.Redis以及物联网平台NewLife.IoT,均成功应用于电力、高校、互联网、电信、交通、物流、工控、医疗、文博等行业,为客户提供了大量先进、可靠、安全、高质量、易扩展的产品和系统集成服务。

我们将不断通过服务的持续改进,成为客户长期信赖的合作伙伴,通过不断的创新和发展,成为国内优秀的IT服务供应商。

新生命团队始于2002年,部分开源项目具有20年以上漫长历史,源码库保留有2010年以来所有修改记录 网站:https://newlifex.com 开源:https://github.com/newlifex QQ群:1600800/1600838微信公众号:
Last Updated: 2023-09-03 19:17:54