今天给大家推荐一个Redis客户端组件NewLife.Redis,NewLife.Redis以高性能处理大数据实时计算为目标。
在ZTO大数据实时计算广泛应用,200多个Redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次
低延迟,Get/Set操作平均耗时200~600us(含往返网络通信)
大吞吐,自带连接池,最大支持1000并发
高性能,支持二进制序列化
Redis实现标准协议以及基础字符串操作,完整实现由独立开源项目NewLife.Redis提供。采取连接池加同步阻塞架构,具有超低延迟(200~600us)以及超高吞吐量的特点。在物流行业大数据实时计算中广泛应有,经过日均100亿次调用量验证。
// 实例化Redis,默认端口6379可以省略,密码有两种写法 //var rds = new FullRedis("127.0.0.1", null, 7); var rds = new FullRedis("127.0.0.1:6379", "pass", 7); //var rds = new FullRedis(); //rds.Init("server=127.0.0.1:6379;password=pass;db=7"); rds.Log = XTrace.Log; // 调试日志。正式使用时注释
新建控制台项目,并在入口函数开头加上 XTrace.UseConsole();
,这是为了方便查看调试日志
具体测试代码之前,需要加上前面MemoryCache或Redis的实例化代码
准备一个模型类User
class User { public String Name { get; set; } public DateTime CreateTime { get; set; } }
添删改查:
var rds = new FullRedis("127.0.0.1", null, 7); var user = new User { Name = "NewLife", CreateTime = DateTime.Now }; rds.Set("user", user, 3600); var user2 = rds.Get("user"); XTrace.WriteLine("Json: {0}", user2.ToJson()); XTrace.WriteLine("Json: {0}", rds.Get("user")); if (rds.ContainsKey("user")) XTrace.WriteLine("存在!"); rds.Remove("user");
执行结果:
14:14:25.990 1 N - SELECT 7 14:14:25.992 1 N - => OK 14:14:26.008 1 N - SETEX user 3600 [53] 14:14:26.021 1 N - => OK 14:14:26.042 1 N - GET user 14:14:26.048 1 N - => [53] 14:14:26.064 1 N - GET user 14:14:26.065 1 N - => [53] 14:14:26.066 1 N - Json: {"Name":"NewLife","CreateTime":"2018-09-25 14:14:25"} 14:14:26.067 1 N - EXISTS user 14:14:26.068 1 N - => 1 14:14:26.068 1 N - 存在! 14:14:26.069 1 N - DEL user 14:14:26.070 1 N - => 1
保存复杂对象时,默认采用Json序列化,所以上面可以按字符串把结果取回来,发现正是Json字符串。
Redis的strings,实质上就是带有长度前缀的二进制数据,[53]表示一段53字节长度的二进制数据。
GetAll/SetAll 在Redis上是很常用的批量操作,同时获取或设置多个key,一般有10倍以上吞吐量。
批量操作:
var rds = new FullRedis("127.0.0.1", null, 7); var dic = new Dictionary{ ["name"] = "NewLife", ["time"] = DateTime.Now, ["count"] = 1234 }; rds.SetAll(dic, 120); var vs = rds.GetAll(dic.Keys); XTrace.WriteLine(vs.Join(",", e => $"{e.Key}={e.Value}"));
执行结果:
MSET name NewLife time 2018-09-25 15:56:26 count 1234 => OK EXPIRE name 120 EXPIRE time 120 EXPIRE count 120 MGET name time count name=NewLife,time=2018-09-25 15:56:26,count=1234
集合操作里面还有 GetList/GetDictionary/GetQueue/GetSet 四个类型集合,分别代表Redis的列表、哈希、队列、Set集合等。
基础版Redis不支持这四个集合,完整版NewLife.Redis支持,MemoryCache则直接支持。
Add 添加,当key不存在时添加,已存在时返回false。
Replace 替换,替换已有值为新值,返回旧值。
Increment 累加,原子操作
Decrement 递减,原子操作
var rds = new FullRedis("127.0.0.1", null, 7); var flag = rds.Add("count", 5678); XTrace.WriteLine(flag ? "Add成功" : "Add失败"); var ori = rds.Replace("count", 777); var count = rds.Get("count"); XTrace.WriteLine("count由{0}替换为{1}", ori, count); rds.Increment("count", 11); var count2 = rds.Decrement("count", 10); XTrace.WriteLine("count={0}", count2);
执行结果:
SETNX count 5678 => 0 Add失败 GETSET count 777 => 1234 GET count => 777 count由1234替换为777 INCRBY count 11 => 788 DECRBY count 10 => 778 count=778
获取方式:https://gitee.com/NewLifeX/NewLife.Redis