NoSql之Redis系列(.Net Core)
一. 简介
1. 什么是Redis?
全称“Remote Dictionary Server”,基于内存管理数据,它有多种数据结构(常用的5种),分别应对不同场景;它是单线程模型的,所以不会存在并发问题,数据不会出现中间状态;对外提供:增删改查、固化、集群等功能,包含0-15个数据存储库。
PS:Redis主要用来提升性能的,尽量不要作为数据的最终依据(当然可以配置高并发架构持久化存储到硬盘)。
2. Redis优点
(1).支持 string、hash、set、sortedset、list、geo 等复杂的数据结构。
(2).高命中的数据运行时是在内存中,数据最终还是可以保存到磁盘中,这样服务器重启之后数据还在。
(3).服务器是单线程的,来自所有客户端的所有命令都是串行执行的,因此不用担心并发修改(串行操作当然还是有并发问题)的问题,编程模型简单。
(4).支持消息订阅/通知机制,可以用作消息队列。
(5).Key、Value 最大长度允许512M。
特别说明:Redis的单线程不用担心并发指定是每个单一操作之间是单线程,比如客户端同时发过来多个针对同一key的StringIncrement自增操作,Redis端是串行进行的,有先后,不会同时进行。 但是如果客户端每个请求是一个组合操作,比如:先KeyExists,再KeyDelete;这个时候很可能第一个客户端KeyExists的时候,数据是存在的,当它要KeyDelete,该数据已经被别的客户端删除了。
3.Redis缺点
(1) Redis 是单线程的,因此单个 Redis 实例只能使用一个CPU核,不能充分发挥服务器的性能。可以在一台服务器上运行多个 Redis 实例,不同实例监听不同端口,再互相组成集群。
(2) 做缓存性能不如 Memcached;
4. 常用工具说明和下载
(1) Redis的Windows版本下载
https://github.com/MicrosoftArchive/redis/tags, 目前最新版本【3.2.1】, .zip类型的是手动exe打开部署, .msi是自动部署成windows服务。
PS:Linux下的Redis已经到了5.x版本了
(2) .Net的两个程序集
a. StackExchange.Redis:免费.【推荐】 (目前最新版本:2.0.601),里面的每类方法基本上都有对应的异步方法
b. ServiceStack.Redis:收费(1小时3600次请求限制),但可以破解,后面介绍
(3).可视化客户端程序:RedisDesktopManager
5. 六大数据结构
(1).String:典型的key-value集合。
(2).Hash:一个key(hashid)对应,多个key-value集合。
(3).Set:一个key对应多个value,且value值不重复,且无序。
(4).SortedSet:一个key对应多个 member-score,member不重复。
(5).List:是一个双向链表,可以左进、左出、右进、右出。
(6).Geo:用来保存兴趣点(POI,point of interest)的坐标信息。可以实现计算两 POI 之间的距离、获取一个点周边指定距离的 POI。
6.Windows版Redis包含文件介绍
(1). redis-server.exe:Redis的服务程序
(2). redis-cli.exe:连接当前Redis服务的客户端
(3). redis.conf : redis相应配置
(4). redis-check-aof.exe:更新日志检查
(5). dump.rdb:持久化到本地保存的数据库文件
二. 基本使用
前提:
①.管理员身份启动Redis服务器【redis-server.exe】,打开可视化客户端RedisDesktopManager进行查看。
②.通过Nuget给Utils层安装程序集【StackExchange.Redis】,将Redis的两个帮助类RedisHelp和RedisHelp2也放到该类,这里我们使用RedisHelp类。
分享RedisHelp相关类代码
/// <summary>
/// Redis帮助类(写法1)
/// </summary>
public class RedisHelp
{
private string _connectionString; //连接字符串
private int _defaultDB; //默认数据库
private readonly ConnectionMultiplexer connectionMultiplexer; /// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionString"></param>
/// <param name="defaultDB">默认使用Redis的0库</param>
public RedisHelp(string connectionString, int defaultDB = )
{
_connectionString = connectionString;
_defaultDB = defaultDB;
connectionMultiplexer = ConnectionMultiplexer.Connect(_connectionString);
} /// <summary>
/// 获取数据库
/// </summary>
/// <returns></returns>
public IDatabase GetDatabase()
{
return connectionMultiplexer.GetDatabase(_defaultDB);
} }
RedisHelp
/// <summary>
/// Redis帮助类(写法2)
/// </summary>
public class RedisHelp2 : IDisposable
{
private string _connectionString; //连接字符串
private string _instanceName; //实例名称
private int _defaultDB; //默认数据库
private ConcurrentDictionary<string, ConnectionMultiplexer> _connections;
public RedisHelp2(string connectionString, string instanceName, int defaultDB = )
{
_connectionString = connectionString;
_instanceName = instanceName;
_defaultDB = defaultDB;
_connections = new ConcurrentDictionary<string, ConnectionMultiplexer>();
} /// <summary>
/// 获取ConnectionMultiplexer
/// </summary>
/// <returns></returns>
private ConnectionMultiplexer GetConnect()
{
return _connections.GetOrAdd(_instanceName, p => ConnectionMultiplexer.Connect(_connectionString));
} /// <summary>
/// 获取数据库
/// </summary>
/// <param name="configName"></param>
/// <param name="db">默认为0:优先代码的db配置,其次config中的配置</param>
/// <returns></returns>
public IDatabase GetDatabase()
{
return GetConnect().GetDatabase(_defaultDB);
} public IServer GetServer(string configName = null, int endPointsIndex = )
{
var confOption = ConfigurationOptions.Parse(_connectionString);
return GetConnect().GetServer(confOption.EndPoints[endPointsIndex]);
} public ISubscriber GetSubscriber(string configName = null)
{
return GetConnect().GetSubscriber();
} public void Dispose()
{
if (_connections != null && _connections.Count > )
{
foreach (var item in _connections.Values)
{
item.Close();
}
}
}
}
RedisHelp2
1.直接通过Redis客户端操作
打开客户端【redis-cli.exe】, 默认存储的是0库,可以通过命令set和get指定进行存储和查询,比如:【set fristName Y】和【get firstName】,如果要选择2库或3库,可以通过指令【select 2】和【select 3】来进行。
补充:如果要连接别的服务器端,通过指令【 redis-cli.exe -h 127.0.0.1 -p 6379】
2.DotNet Core控制台操作
实例化RedisHelp类,传入连接字符串和默认数据库,进行string类型的key-value存储和查询.
(1). 客户端读取配置文件,并创建RedisHelp实例。 通过Nuget安装程序集:【Microsoft.Extensions.Configuration】和【Microsoft.Extensions.Configuration.Json】
{
"RedisStr": {
"connectionString": "localhost:6379",
"defaultDB":
}
}
//读取Redis的相关配置
var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
var Configuration = configurationBuilder.Build();
var _connectionString = Configuration["RedisStr:connectionString"]; //连接字符串
int _defaultDB = Convert.ToInt32(Configuration["RedisStr:defaultDB"]); //默认数据库
RedisHelp redis = new RedisHelp(_connectionString, _defaultDB);
var db = redis.GetDatabase();
(2). 进行简单的插入和查询操作。
db.StringSet("name", "fk");
Console.WriteLine("插入成功");
string d1 = db.StringGet("name");
Console.WriteLine($"获取成功,name的值为{d1}");
3.CoreMvc操作
在类ConfigureServices中获取Redis的配置并注册RedisHelp单例类,然后在对应控制器中进行注入使用即可。将RedisHelp注册成单例类,然后在对应的控制器中进行注入,使用即可。这里再补充一种读取配置文件的方式,利用IOptions<T>,详见下面RedisHelp_Test类的注入。
/// <summary>
/// Redis帮助类(写法1)
/// </summary>
public class RedisHelp
{
private string _connectionString; //连接字符串
private int _defaultDB; //默认数据库
private readonly ConnectionMultiplexer connectionMultiplexer; /// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionString"></param>
/// <param name="defaultDB">默认使用Redis的0库</param>
public RedisHelp(string connectionString, int defaultDB = )
{
_connectionString = connectionString;
_defaultDB = defaultDB;
connectionMultiplexer = ConnectionMultiplexer.Connect(_connectionString);
} /// <summary>
/// 获取数据库
/// </summary>
/// <returns></returns>
public IDatabase GetDatabase()
{
return connectionMultiplexer.GetDatabase(_defaultDB);
} }
RedisHelp
/// <summary>
/// 内容同RedisHelp相同,这里是为了测试另外一种配置文件读取的方式
/// </summary>
public class RedisHelp_Test
{
private readonly IOptions<RedisSetting> _redisSetting;
private readonly ConnectionMultiplexer _connectionMultiplexer; /// <summary>
/// 构造函数
/// </summary>
/// <param name="connectionString"></param>
/// <param name="defaultDB">默认使用Redis的0库</param>
public RedisHelp_Test(IOptions<RedisSetting> redisSetting)
{
this._redisSetting = redisSetting;
_connectionMultiplexer = ConnectionMultiplexer.Connect(_redisSetting.Value.connectionString);
} /// <summary>
/// 获取数据库
/// </summary>
/// <returns></returns>
public IDatabase GetDatabase()
{
return _connectionMultiplexer.GetDatabase(_redisSetting.Value.defaultDB);
}
}
RedisHelp_Test
{
"RedisStr": {
"connectionString": "localhost:6379",
"defaultDB":
}
}
public void ConfigureServices(IServiceCollection services)
{
//获取Redis配置,注入RedisHelp单例对象
{
var connectionString = Configuration["RedisStr:connectionString"];
int defaultDB = Convert.ToInt32(Configuration["RedisStr:defaultDB"]);
services.AddSingleton(new RedisHelp(connectionString, defaultDB));
}
//另外一种读取Redis配置的方法
{
services.AddOptions().Configure<RedisSetting>(Configuration.GetSection("RedisStr"));
services.AddSingleton<RedisHelp_Test>();
}
services.AddControllersWithViews();
}
public class HomeController : Controller
{
private readonly IDatabase _redis;
private readonly IDatabase _redis2;
public HomeController(RedisHelp redisHelp,RedisHelp_Test redisHelp_Test)
{
_redis = redisHelp.GetDatabase();
_redis2 = redisHelp_Test.GetDatabase();
}
public IActionResult Index()
{
_redis.StringSet("myName", "ypf");
var data = _redis.StringGet("myName");
var data2 = _redis2.StringGet("myName");
return View();
}
}
HomeController
三. 后续目录
第二节: Set类型和SortedSet类型的介绍和案例应用
第三节: List类型的介绍、生产者消费者模式、发布订阅模式
第四节:Geo类型介绍以及Redis批量操作、事务、分布式锁
第五节:Redis架构演变历程和cluster集群模式架构的搭建
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
NoSql之Redis系列(.Net Core)的更多相关文章
- NoSql数据库Redis系列(1)——Redis简介
一.redis介绍 (一).Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点 ...
- NoSql数据库Redis系列(6)——Redis数据过期策略详解
本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...
- NoSql数据库Redis系列(5)——Redis主从复制
前面介绍Redis,我们都在一台服务器上进行操作的,也就是说读和写以及备份操作都是在一台Redis服务器上进行的,那么随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都 ...
- NoSql数据库Redis系列(4)——Redis数据持久化(AOF)
上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严 ...
- NoSql数据库Redis系列(3)——Redis数据持久化(RDB)
大家都知道 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库 ...
- NoSql数据库Redis系列(2)——Redis数据类型
一.设计 Redis Key (一).分段设计法 使用冒号把 key 中要表达的多种含义分开表示,步骤如下: 1.把表名转化为 key 前缀 2.主键名(或其他常用于搜索的字段) 3.主键值 4.要存 ...
- Redis系列(1)之安装
Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富, ...
- Redis系列整理
0.Redis系列-安装部署维护篇 1.Redis系列-远程连接redis并给redis加锁 2.Redis系列-存储篇string主要操作函数小结 3.Redis系列-存储篇list主要操作函数小结 ...
- Redis系列(一):Redis的简介与安装
原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...
随机推荐
- Android方法数超出限定的问题(multiDex,jumboMode)
在Android项目开发中,项目代码量过大或通过引入很多jar导致代码量急剧增加,会出现错误: android.dex.DexIndexOverflowException: Cannot merge ...
- 【BZOJ4823】[CQOI2017]老C的方块(网络流)
[BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...
- C++ 名字重载、隐藏、覆盖
名字重载Name overloading 如果顶层函数有不同的签名,则函数名可以相同. 如果同一类中的函数有不同的签名,则函数名可以相同. C++中允许在相同的作用域内以相同的名字定义几个不同实现 ...
- 列举常见国内外做服务器与存储的IT厂家
列举常见国内外做服务器与存储的IT厂家 联想.浪潮.曙光.同有飞骥.迪菲特.宝德.星盈.元谷.威联通.群晖.忆捷.天敏等 华为.华三.戴尔.神州云科.同有.谷数,都是比较大的厂商 HDS(昆仑联通). ...
- vscode wsl git 换行符问题autocrlf
wsl中使用code,由于windows换行符问题git会显示大量文件修改,此时需要在wsl中设置autocrlf设置 git config --global core.autocrlf input ...
- 使用pytorch时所遇到的问题总结
使用pytorch时所遇到的问题总结 1.ubuntu vscode切换虚拟环境 在ubuntu系统上,配置工作区文件夹所使用的虚拟环境.之前笔者误以为只需要在vscode内置的终端上将虚拟环境切换过 ...
- 天天向上的力量python(举一反三)
天天向上的力量python实例(举一反三) 实例1: 一年365天,以第1天的能力值为基数,记为1.0,当好好学习时能力值相比前一天提高0.1%,没有学习实能力值相比前一天下降0.1%. 问:每天努力 ...
- oracle学习笔记(十七) PL/SQL高级应用
PL/SQL高级应用 动态SQL 在PL/SQL中,不能直接执行DDL(create,alter,drop),得使用动态SQL,当然,除了DDL,动态SQL也可以执行DML(select,insert ...
- NET EF 连接Oracle 的配置方法记录
主要记录下如何在EF 中连接Oracle s数据库,很傻瓜式,非常简单,但是不知道的童鞋,也会搞得很难受,我自己就是 1.创一个控制台程序,并且添加 Oracle.ManagedDataAccess ...
- bayaim_linux_install_oracle_11g - 20181102
-- 2018-11-2 15:12:12— baipingyang -- bayaim-- bayaim_linux_install_oracle_11g: -------------------- ...