NewLife.Redis基础教程
X组件缓存架构以ICache接口为核心,包括MemoryCache、Redis和DbCache实现,支持FX和netstandard2.0!
后续例程与使用说明均以Redis为例,各缓存实现类似。
Redis组件:Nuget包NewLife.Redis,源码 https://github.com/NewLifeX/NewLife.Redis
X组件:Nuget包NewLife.Core,源码 https://github.com/NewLifeX/X
一、内存缓存 MemoryCache
MemoryCache核心是并行字典ConcurrentDictionary,由于省去了序列化和网络通信,使得它具有千万级超高性能(普通台式机实测1600万tps)。
MemoryCache支持过期时间,默认容量10万个,未过期key超过该值后,每60秒根据LRU清理溢出部分。
常用于进程内千万级以下数据缓存场景。
// 缓存默认实现Cache.Default是MemoryCache,可修改
//var ic = Cache.Default;
//var ic = new MemoryCache();
二、基础 Redis
Redis实现标准协议以及基础字符串操作,完整实现由独立开源项目NewLife.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", );
//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, );
var user2 = ic.Get<User>("user");
XTrace.WriteLine("Json: {0}", ic.Get<String>("user"));
if (ic.ContainsKey("user")) XTrace.WriteLine("存在!");
ic.Remove("user");
执行结果:
::25.990 N - SELECT
::25.992 N - => OK
::26.008 N - SETEX user []
::26.021 N - => OK
::26.042 N - GET user
::26.048 N - => []
::26.064 N - GET user
::26.065 N - => []
::26.066 N - Json: {"Name":"NewLife","CreateTime":"2018-09-25 14:14:25"}
::26.067 N - EXISTS user
::26.068 N - =>
::26.068 N - 存在!
::26.069 N - DEL user
::26.070 N - =>
保存复杂对象时,默认采用Json序列化,所以上面可以按字符串把结果取回来,发现正是Json字符串。
Redis的strings,实质上就是带有长度前缀的二进制数据,[53]表示一段53字节长度的二进制数据。
五、集合操作
GetAll/SetAll 在Redis上是很常用的批量操作,同时获取或设置多个key,一般有10倍以上吞吐量。
批量操作:
var dic = new Dictionary<String, Object>
{
["name"] = "NewLife",
["time"] = DateTime.Now,
["count"] =
};
ic.SetAll(dic, ); var vs = ic.GetAll<String>(dic.Keys);
XTrace.WriteLine(vs.Join(",", e => $"{e.Key}={e.Value}"));
执行结果:
MSET name NewLife time -- :: count
=> OK
EXPIRE name
EXPIRE time
EXPIRE count
MGET name time count
name=NewLife,time=-- ::,count=
集合操作里面还有 GetList/GetDictionary/GetQueue/GetSet 四个类型集合,分别代表Redis的列表、哈希、队列、Set集合等。
基础版Redis不支持这四个集合,完整版NewLife.Redis支持,MemoryCache则直接支持。
六、高级操作
- Add 添加,当key不存在时添加,已存在时返回false。
- Replace 替换,替换已有值为新值,返回旧值。
- Increment 累加,原子操作
- Decrement 递减,原子操作
高级操作:
var flag = ic.Add("count", );
XTrace.WriteLine(flag ? "Add成功" : "Add失败");
var ori = ic.Replace("count", );
var count = ic.Get<Int32>("count");
XTrace.WriteLine("count由{0}替换为{1}", ori, count); ic.Increment("count", );
var count2 = ic.Decrement("count", );
XTrace.WriteLine("count={0}", count2);
执行结果:
SETNX count
=>
Add失败
GETSET count
=>
GET count
=>
count由1234替换为777
INCRBY count
=>
DECRBY count
=>
count=
七、性能测试
Bench 会分根据线程数分多组进行添删改压力测试。
rand 参数,是否随机产生key/value。
batch 批大小,分批执行读写操作,借助GetAll/SetAll进行优化。
Redis默认设置AutoPipeline=100,无分批时打开管道操作,对添删改优化。
Redis性能测试[随机],批大小[],逻辑处理器 个 ,400MHz Intel(R) Xeon(R) CPU E5- v4 @ .40GHz
测试 , 项, 线程
赋值 , 项, 线程,耗时 418ms 速度 , ops
读取 , 项, 线程,耗时 520ms 速度 , ops
删除 , 项, 线程,耗时 125ms 速度 , ops
测试 , 项, 线程
赋值 , 项, 线程,耗时 548ms 速度 , ops
读取 , 项, 线程,耗时 549ms 速度 , ops
删除 , 项, 线程,耗时 315ms 速度 , ops
测试 , 项, 线程
赋值 , 项, 线程,耗时 694ms 速度 , ops
读取 , 项, 线程,耗时 697ms 速度 , ops
删除 , 项, 线程,耗时 438ms 速度 , ops
测试 , 项, 线程
赋值 , 项, 线程,耗时 ,206ms 速度 , ops
读取 , 项, 线程,耗时 ,236ms 速度 , ops
删除 , 项, 线程,耗时 791ms 速度 ,, ops
测试 ,, 项, 线程
赋值 ,, 项, 线程,耗时 ,848ms 速度 , ops
读取 ,, 项, 线程,耗时 ,399ms 速度 , ops
删除 ,, 项, 线程,耗时 ,281ms 速度 , ops
测试 ,, 项, 线程
赋值 ,, 项, 线程,耗时 ,806ms 速度 , ops
读取 ,, 项, 线程,耗时 ,365ms 速度 , ops
删除 ,, 项, 线程,耗时 ,716ms 速度 , ops
Redis组件:Nuget包NewLife.Redis,源码 https://github.com/NewLifeX/NewLife.Redis
X组件:Nuget包NewLife.Core,源码 https://github.com/NewLifeX/X
如果你喜欢我们的开源项目,到github赏个star呗^_^
NewLife.Redis基础教程的更多相关文章
- mongodb,Mysql,redis基础教程
数据库基础 1:mongodb基础教程 1:pymongo基础教程 2:Mysql基础教程 3:redis基础教程
- (Redis基础教程之六)如何使用Redis中的List
如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...
- Redis基础教程
说明:本文中涉及的代码是c#所写,连接redis的第三方驱动为ServiceStack.Redis.连接redis的客户端软件为redis-desktop-manager. 一.Redis是什么 Re ...
- Spring Boot 2.x基础教程:使用集中式缓存Redis
之前我们介绍了两种进程内缓存的用法,包括Spring Boot默认使用的ConcurrentMap缓存以及缓存框架EhCache.虽然EhCache已经能够适用很多应用场景,但是由于EhCache是进 ...
- Spring Boot 2.x基础教程:使用Redis的发布订阅功能
通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...
- Redis入门教程(二)
推荐阅读: Redis入门教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的数据结构 5.1 Redis 数据结构介绍 redi ...
- Shiro 基础教程
原文地址:Shiro 基础教程 博客地址:http://www.extlight.com 一.前言 Apache Shiro 是 Java 的一个安全框架.功能强大,使用简单的Java安全框架,它为开 ...
- 超强、超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- 超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...
随机推荐
- Linux环境下Flask部署至apache
https://blog.csdn.net/rainbowlemonade/article/details/79725328
- 使用VS+OpenCV调用深度学习模型
最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手.这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的 ...
- python_flask 基础巩固 (URL_FOR 详解)
URL_FOR 详解 url_for 通过 视图函数能够返回对应的url,url_for 有两个参数,endpoint(视图 函数)和关键字参数 url_for('my_list',page=2),多 ...
- eslint 的 env 配置是干嘛使的?
这笔修改体现了 env 和 global 的关系: https://github.com/g8up/youDaoDict/commit/8b05616f 官方文档表述: https://eslint. ...
- docker install
1.安装必要工具集 sudo yum install -y yum-utils 2.安装Docker官方源 sudo yum-config-manager \ --add-repo \ https:/ ...
- hadoop2.7单节点
$ sudo apt-get install ssh$ sudo apt-get install rsync 修改文件 etc/hadoop/hadoop-env.sh # set to the ro ...
- Linux命令中:rsync和scp之间的区别
scp是把文件全部复制过去,当文件修改后还是把所有文件复制过去, rsync 第一次是把所有文件同步过去,当文件修改后,只把修改的文件同步过去 rsync -av 10.251.205.8:/usr1 ...
- Python基础理论 - 函数
函数是第一类对象:可以当做数据来传 1. 可以被引用 2. 可以作为函数参数 3. 可以作为函数返回值 4. 可以作为容器类型的元素 小例子: def func1(): print('func ...
- MySQL--BNL/ICP/MRR/BKA
#======================================================##MySQL关联查询算法:BNL(Block Nested-Loop)ICP(Index ...
- Windows 10 IoT Core 17115 for Insider 版本更新
今天,微软发布了Windows 10 IoT Core 17115 for Insider 版本更新,本次更新只修正了一些Bug,没有发布新的特性. 一些已知的问题如下: F5 driver depl ...