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.谁在使 ...
随机推荐
- 【Python】【BugList13】req = requests.get(url=target)报错: (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)')
[代码] # -*- coding:UTF-8 -*- import requests if __name__ == '__main__': target = 'https://unsplash.co ...
- Mac OS mysql数据库安装与初始化
一.官网下载mysql 二.安装并启用 三.数据库初始化 192:bin zhuyajing$ ./mysql -u root -p Enter password: Welcome to the My ...
- 爬取QQ音乐(讲解爬虫思路)
一.问题描述: 本次爬取的对象是QQmusic,为自己后面做django音乐网站的开发获取一些资源. 二.问题分析: 由于QQmusic和网易音乐的方式差不多,都是讲歌曲信息放入到播放界面播放,在其他 ...
- C语言闰年问题程序框图
判定2000-2500年中的每一年是否为闰年,并将结果输出. 先分析闰年成立条件: 1)能被4整除,但不能被100整除的年份都是闰年: (2)能被400整除的年份是闰年: #include<st ...
- 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...
- mpdf-html转PDF,中文字符乱码、加粗问题
$defaultConfig = (new ConfigVariables())->getDefaults(); $fontDirs = $defaultConfig['fontDir']; $ ...
- Educational Codeforces Round 58 (Rated for Div. 2) F dp + 优化(新坑) + 离线处理
https://codeforces.com/contest/1101/problem/F 题意 有n个城市,m辆卡车,每辆卡车有起点\(s_i\),终点\(f_i\),每公里油耗\(c_i\),可加 ...
- Win7 VS2017编译magnum及例子
magnum是一个开源的图形中间件 Lightweight and modular C++11/C++14 graphics middleware for games and data visuali ...
- easyUI dialog打开对话框,显示列表数据,选取一条数据操作后赋值给父窗口 resultMap声明为全局,生成getset方法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...
- WEB服务器搭建(Apache+Tomcat+eclipse)
1.下载xampp安装,选择Apache+MySQL+Tomcat 官方下载链接:https://www.apachefriends.org/zh_cn/download.html 2.下载安装jav ...