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.谁在使 ...
随机推荐
- Redis的启动及配置
在redis已经安装完成的情况下,进入redis/bin目录下,输入命令: ./redis-server,就可以直接启动redis了,效果如图所示: 但是此时终端无法进行任何操作,按CTRL+c命令, ...
- windowsSevice程序和topshelf程序创建服务对比
文章原地址:http://www.80iter.com/blog/1451523192435464 Topshelf 创建.net服务整理和安装步骤 windowsService和topshelf服务 ...
- gensim自然语言处理
参考代码 ChineseClean_demo1.py: # -*- coding:utf-8 -*- import xlrd import xlwt ''' python3.4 ''' # file ...
- Note of Python Math
Note of Python Math math 库是Python 提供的内置数学类函数库,而其中复数类型常用于科学计算,一般计算并不常用,因此math 库不支持复数类型.math 库一共提供4个数学 ...
- mysql的ACID的理解
这是在网上copy下来的ACID的概念,可以直接跳过看后面: 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开 ...
- 10.1牛客J题
https://www.nowcoder.com/acm/contest/201/J Description: 给你一行括号,定义了括号合格的形式,然后Q次询问,问你这个区间内括号是否合格 Solut ...
- Xftp5软件使用详解
一.首先运行Xftp5,然后导航栏上面有个小加号,点击进去. 二.接着出现如下界面,在这里填写名称(这个随意填写),主机填写要连接的主机的IP地址,然后协议的话,Linux系统一般选择SFTP协议,端 ...
- 10分钟看懂Docker和K8S
本文来源:鲜枣课堂 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的 ...
- fescar分布式事务(概览)
1. fescar分布式事务(概览) 1.1. 概述 Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 并且对业务0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题. 1.2 ...
- 电商门户网站商品品类多级联动SpringBoot+Thymeleaf实现
在淘宝.京东等电商网站,其门户网站都有一个商品品类的多级联动,鼠标移动,就显示,因为前端不是我做的,所以不说明前端实现,只介绍后端实现. 搭建部署SpringBoot环境 配置文件配置: 开启了对Th ...