一. 简介

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

三. 后续目录

第一节: String类型和Hash类型的介绍和案例应用

第二节: Set类型和SortedSet类型的介绍和案例应用

第三节: List类型的介绍、生产者消费者模式、发布订阅模式

第四节:Geo类型介绍以及Redis批量操作、事务、分布式锁

第五节:Redis架构演变历程和cluster集群模式架构的搭建

第六节:秒杀业务/超卖问题的几种解决思路

第七节:

第八节:

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

NoSql之Redis系列(.Net Core)的更多相关文章

  1. NoSql数据库Redis系列(1)——Redis简介

    一.redis介绍 (一).Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点 ...

  2. NoSql数据库Redis系列(6)——Redis数据过期策略详解

    本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...

  3. NoSql数据库Redis系列(5)——Redis主从复制

    前面介绍Redis,我们都在一台服务器上进行操作的,也就是说读和写以及备份操作都是在一台Redis服务器上进行的,那么随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都 ...

  4. NoSql数据库Redis系列(4)——Redis数据持久化(AOF)

    上一篇文章我们介绍了Redis的RDB持久化,RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严 ...

  5. NoSql数据库Redis系列(3)——Redis数据持久化(RDB)

    大家都知道 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库 ...

  6. NoSql数据库Redis系列(2)——Redis数据类型

    一.设计 Redis Key (一).分段设计法 使用冒号把 key 中要表达的多种含义分开表示,步骤如下: 1.把表名转化为 key 前缀 2.主键名(或其他常用于搜索的字段) 3.主键值 4.要存 ...

  7. Redis系列(1)之安装

    Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富, ...

  8. Redis系列整理

    0.Redis系列-安装部署维护篇 1.Redis系列-远程连接redis并给redis加锁 2.Redis系列-存储篇string主要操作函数小结 3.Redis系列-存储篇list主要操作函数小结 ...

  9. Redis系列(一):Redis的简介与安装

    原文链接(转载请注明出处):Redis系列(一):Redis的简介与安装 什么是 Redis Redis 是一个使用ANSI C 编写的开源.支持网络协议.基于内存.可选持久性的键值对数据库,它是一个 ...

随机推荐

  1. url中拼接中文参数,后台接收为乱码的问题

    遇到在URL中拼接中文的参数,后台拿到的数据为乱码的问题,这里来说一下问题出现的原因与解决方法. 大家比较关心的应该是解决的方法,因此先说解决方法. 解决方法 解决的方法是在客户端对这个中文参数进行编 ...

  2. rxJava2.x源码解析

    一. Rxjava是什么 Rxjava在GitHub的介绍是 "A library for composing asynchronous and event-based programs u ...

  3. WEB-INF文件夹作用

    WEB-INF是Java的WEB应用的安全目录,客户端无法访问,只能通过服务端访问,从而实现了代码的安全.在WEB-INF中主要是系统运行的配置信息和环境 主要有classes.config.lib文 ...

  4. 两种查看EFCore生成Sql语句的方法

    一.利用反射生成查询语句 该方法转载自:https://jhrs.com/2019/28488.html (略有修改) using Microsoft.EntityFrameworkCore.Quer ...

  5. 【IDEA】(2)---MAC代码模版

    IDEA(2)-MAC代码模版 IDEA提供了许多的自带代码模版,这些模版主要是对于我们经常开发用到的代码制作成一个模版,比如for循环,这个是经常会用到的代码,如果没有代码模版,我们需要一个一个手动 ...

  6. Delphi - 创建SuperDll 持续更新

    Delphi SuperDll 作为一名5年的Delpher,一直认为Delphi是桌面应用的王者,我相信其他的Delpher也这么认为. 但是,慢慢的我发现普通方式的Delphi开发会造成代码的严重 ...

  7. python基础(16):内置函数(二)

    1. lamda匿名函数 为了解决⼀些简单的需求⽽设计的⼀句话函数 # 计算n的n次⽅ def func(n): return n**n print(func(10)) f = lambda n: n ...

  8. 让你彻底理解volatile,面试不再愁

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  9. Java日期时间API系列4-----Jdk7及以前的日期时间类的线程安全问题

    1.Date类为可变的,在多线程并发环境中会有线程安全问题. (1)可以使用锁来处理并发问题. (2)使用JDK8  Instant 或 LocalDateTime替代. 2.Calendar的子类为 ...

  10. [日常] Redis中set集合的使用思考

    公司部门同事有个需求,就是需要把当前另一个部门a中存储的数据全部导出来,自己当前业务b的数据全部导出来,两个要取一下差集,把a中存在,b中不存在的记下来,要去调用某接口把对应的文件删除.这个我感觉可以 ...