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.谁在使 ...
随机推荐
- xml文档格式学习笔记
xml入门经典 (pdf书籍) https://www.cnblogs.com/zhaopengcheng/p/6848802.html
- shell遍历文件夹
遍历目录下的所有文件 假如有一个文件夹路径为dir,遍历文件 for file in /path/dir/* do if test -f $file then echo $file arrary=($ ...
- pycharm无法使用ctrl+c/v复制粘贴的问题
最近在使用pycharm的时候发现不能正常使用ctrl+c/v进行复制粘贴,也无法使用tab键对大段代码进行整体缩进.后来发现是因为安装了vim插件的问题,在setting里找到vim插件,取消勾选即 ...
- karaf 控制台 常用linux指令(1)
0,切换命令当前域名 -bash代码 *:feature 命令是由域名+命令名组成的,切换当前域名,比如切换到*:feature,那么再输入list,则执行的是feature:list,切换到*:bu ...
- 6 week work 2
CSS颜色表示法和颜色表(调色板) 1.用颜色名表示 如:white.red.greenyellow.gold等. 2.用十六进制的颜色值表示(红.绿.蓝) #FF0000或者#F00 3.用rgb( ...
- leetcode第一天-merge two binary trees
有段时间没有写代码了,脑子都生锈了,今后争取笔耕不辍(立flag,以后打脸) 随机一道Leecode题, Merge Two Binary Trees,题目基本描述如下: Given two bina ...
- linux-ssh登陆导语
用户登录前显示的导语信息(在你选择的文件中配置,例如 /etc/login.warn) 用户成功登录后显示的导语信息(在 /etc/motd 中配置) 如何在用户登录前连接系统时显示消息 当用户连接到 ...
- #218 Iterate with JavaScript For Loops
一个条件语句只能执行一次代码,而一个循环语句可以多次执行代码. JavaScript 中最常见的循环就是“for循环”. for循环中的三个表达式用分号隔开: for ([初始化]; [条件判断]; ...
- day_4流程控制之分支结构循环结构及for循环
复习一下昨天的内容 1:变量的命名规范 只能由数字 字母 及下划线组成 不能以数字开头 不能与系统关键字重名 _开头有特殊含义 __开头__结尾的变量是魔法变量 支持大小驼峰 ,但建议使用下划线连接语 ...
- 写在HTTP协议之前
1.网络模型 OSI模型即:开放系统互连参考模型(Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参 ...