NewLife.Redis基础教程
以ICache接⼝为核⼼,包括MemoryCache、Redis和DbCache实现,⽀持FX和netstandard2.0!
后续例程与使⽤说明均以Redis为例,各缓存实现类似。
⼀、内存缓存 MemoryCache
MemoryCache核⼼是并⾏字典ConcurrentDictionary,由于省去了序列化和⽹络通信,使得它具有千万级超⾼性能(普通台式机实测1600万tps)。
MemoryCache⽀持过期时间,默认容量10万个,未过期key超过该值后,每60秒根据LRU清理溢出部分。
常⽤于进程内千万级以下数据缓存场景。
// 缓存默认实现Cache.Default是MemoryCache,可修改
//var ic = Cache.Default;
//var ic = new MemoryCache();
⼆、基础 Redis
Redis实现标准协议以及基础字符串操作,完整实现由独⽴开源项⽬提供。
采取连接池加同步阻塞架构,具有超低延迟(200~600us)以及超⾼吞吐量(实测222万ops/900Mbps)的特点。
在物流⾏业⼤数据实时计算中⼴泛应有,经过⽇均100亿次调⽤量验证。
// 实例化Redis,默认端⼝6379可以省略,密码有两种写法
//var ic = Redis.Create("127.0.0.1", 7);
var ic = Redis.Create("pass@127.0.0.1:6379", 7);
//var ic = Redis.Create("server=127.0.0.1:6379;password=pass", 7);
ic.Log = XTrace.Log; // 调试⽇志。正式使⽤时注释
三、数据库 DbCache
DbCache属于实验性质,采⽤数据库存储数据,默认SQLite。
四、基本操作
在基本操作之前,我们先做⼀些准备⼯作:
新建控制台项⽬,并在⼊⼝函数开头加上  XTrace.UseConsole();  ,这是为了⽅便查看调试⽇志
具体测试代码之前,需要加上前⾯MemoryCache或Redis的实例化代码
准备⼀个模型类User
class User
{
public String Name { get; set; }
public DateTime CreateTime { get; set; }
}
添删改查:
var user = new User { Name = "NewLife", CreateTime = DateTime.Now };
ic.Set("user", user, 3600);
var user2 = ic.Get<User>("user");
XTrace.WriteLine("Json: {0}", ic.Get<String>("user"));
if (ic.ContainsKey("user")) XTrace.WriteLine("存在!");
ic.Remove("user");
执⾏结果:
14:14:25.9901 N - SELECT 7
14:14:25.9921 N - => OK
14:14:26.0081 N - SETEX user 3600 [53]
14:14:26.0211 N - => OK
14:14:26.0421 N - GET user
14:14:26.0481 N - => [53]
14:14:26.0641 N - GET user
14:14:26.0651 N - => [53]
14:14:26.0661 N - Json: {"Name":"NewLife","CreateTime":"2018-09-25 14:14:25"}
14:14:26.0671 N - EXISTS user
14:14:26.0681 N - => 1
14:14:26.0681 N - 存在!
14:14:26.0691 N - DEL user
14:14:26.0701 N - => 1
保存复杂对象时,默认采⽤Json序列化,所以上⾯可以按字符串把结果取回来,发现正是Json字符串。
Redis的strings,实质上就是带有长度前缀的⼆进制数据,[53]表⽰⼀段53字节长度的⼆进制数据。
五、集合操作
GetAll/SetAll 在Redis上是很常⽤的批量操作,同时获取或设置多个key,⼀般有10倍以上吞吐量。
批量操作:
var dic = new Dictionary<String, Object>
{
["name"] = "NewLife",
["time"] = DateTime.Now,
["count"] = 1234
};
ic.SetAll(dic, 120);
var vs = ic.GetAll<String>(dic.Keys);
XTrace.WriteLine(vs.Join(",", e => $"{e.Key}={e.Value}"));
writeline教程执⾏结果:
MSET name NewLife time 2018-09-2515:56:26 count 1234
=> OK
EXPIRE name 120
EXPIRE time 120
EXPIRE count 120
MGET name time count
name=NewLife,time=2018-09-2515:56:26,count=1234
集合操作⾥⾯还有 GetList/GetDictionary/GetQueue/GetSet 四个类型集合,分别代表Redis的列表、哈希、队列、Set集合等。基础版Redis不⽀持这四个集合,完整版⽀持,MemoryCache则直接⽀持。
六、⾼级操作
Add 添加,当key不存在时添加,已存在时返回false。
Replace 替换,替换已有值为新值,返回旧值。
Increment 累加,原⼦操作
Decrement 递减,原⼦操作
⾼级操作:
var flag = ic.Add("count", 5678);
XTrace.WriteLine(flag ? "Add成功" : "Add失败");
var ori = ic.Replace("count", 777);
var count = ic.Get<Int32>("count");
XTrace.WriteLine("count由{0}替换为{1}", ori, count);
ic.Increment("count", 11);
var count2 = ic.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
七、性能测试
Bench 会分根据线程数分多组进⾏添删改压⼒测试。
rand 参数,是否随机产⽣key/value。
batch 批⼤⼩,分批执⾏读写操作,借助GetAll/SetAll进⾏优化。
Redis默认设置AutoPipeline=100,⽆分批时打开管道操作,对添删改优化。
Redis性能测试[随机],批⼤⼩[100],逻辑处理器40个2,400MHz Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz 测试100,000项,1线程
赋值100,000项,1线程,耗时    418ms 速度239,234 ops
读取100,000项,1线程,耗时    520ms 速度192,307 ops
删除100,000项,1线程,耗时    125ms 速度800,000 ops
测试200,000项,2线程
赋值200,000项,2线程,耗时    548ms 速度364,963 ops
读取200,000项,2线程,耗时    549ms 速度364,298 ops
删除200,000项,2线程,耗时    315ms 速度634,920 ops
测试400,000项,4线程
赋值400,000项,4线程,耗时    694ms 速度576,368 ops
读取400,000项,4线程,耗时    697ms 速度573,888 ops
删除400,000项,4线程,耗时    438ms 速度913,242 ops
测试800,000项,8线程
赋值800,000项,8线程,耗时1,206ms 速度663,349 ops
读取800,000项,8线程,耗时1,236ms 速度647,249 ops
删除800,000项,8线程,耗时    791ms 速度1,011,378 ops
测试4,000,000项,40线程
赋值4,000,000项,40线程,耗时4,848ms 速度825,082 ops
读取4,000,000项,40线程,耗时5,399ms 速度740,877 ops
删除4,000,000项,40线程,耗时6,281ms 速度636,841 ops
测试4,000,000项,64线程
赋值4,000,000项,64线程,耗时6,806ms 速度587,716 ops
读取4,000,000项,64线程,耗时5,365ms 速度745,573 ops
删除4,000,000项,64线程,耗时6,716ms 速度595,592 ops
如果你喜欢我们的开源项⽬,到github赏个star呗^_^

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。