.net core redis的全套操作

640?wx_fmt=gif

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。


Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。


目录

一、在centos7上安装redis

二、redis string类型

三、redis list 类型

四、redis hash类型

五、redis sortedset类型

六、redis Subscribe 与 Publish

七、redis数据迁移

准备条件

  1. 准备redis的安装源

  2. 准备nuget包:StackExchange.Redis

实战之路

一、在centos7上安装redis

下载最新Remi的软件源

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

安装redis

yum --enablerepo=remi install redis

启动redis

systemctl start redis

设置redis开机启动

systemctl enable redis

二、redis string类型

1、string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。 


以下是对String类型的所有操作方法。

原码地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs

2、在.netcore 中的调用。

var flag = redisManager.StringSet("dylan", "公众号为:sharecore");	
var value = redisManager.StringGet("dylan");	
Console.WriteLine($"获取缓存值为:{value}");

三、redis list 类型

1、Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

个人认为list是非常好用的一个类型,我们可以把Redis的list当成消息队列使用,比如向注册用户发送欢迎邮件的工作,可以在注册的流程中把要发送邮件的邮箱放到list中,另一个程序从list中pop获取邮件来发送。生产者、消费者模式。把生产过程和消费过程隔离。


640?wx_fmt=jpeg

List类型的所有操作方法。

#region List	#region 同步方法	/// <summary>	/// 移除指定ListId的内部List的值	/// </summary>	/// <param name="key"></param>	/// <param name="value"></param>	public void ListRemove<T>(string key, T value)	{	key = AddSysCustomKey(key);	Do(db => db.ListRemove(key, ConvertJson(value)));	}	/// <summary>	/// 获取指定key的List	/// </summary>	/// <param name="key"></param>	/// <returns></returns>	public List<T> ListRange<T>(string key)	{	key = AddSysCustomKey(key);	return Do(redis =>	{	var values = redis.ListRange(key);	return ConvetList<T>(values);	});	}	/// <summary>	/// 入队	/// </summary>	/// <param name="key"></param>	/// <param name="value"></param>	public void ListRightPush<T>(string key, T value)	{	key = AddSysCustomKey(key);	Do(db => db.ListRightPush(key, ConvertJson(value)));	}	/// <summary>	/// 出队	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <returns></returns>	public T ListRightPop<T>(string key)	{	key = AddSysCustomKey(key);	return Do(db =>	{	var value = db.ListRightPop(key);	return ConvertObj<T>(value);	});	}	/// <summary>	/// 入栈	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <param name="value"></param>	public void ListLeftPush<T>(string key, T value)	{	key = AddSysCustomKey(key);	Do(db => db.ListLeftPush(key, ConvertJson(value)));	}	/// <summary>	/// 出栈	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <returns></returns>	public T ListLeftPop<T>(string key)	{	key = AddSysCustomKey(key);	return Do(db =>	{	var value = db.ListLeftPop(key);	return ConvertObj<T>(value);	});	}	/// <summary>	/// 获取集合中的数量	/// </summary>	/// <param name="key"></param>	/// <returns></returns>	public long ListLength(string key)	{	key = AddSysCustomKey(key);	return Do(redis => redis.ListLength(key));	}	#endregion 同步方法	#region 异步方法	直接复制同步的方法,在方法外后面加上Async即可	#endregion 异步方法	#endregion List

2、在.netcore 中的调用。

入队:

redisManager.ListRightPush("dylan", "sharecore我是入队的");//入队	
long len = redisManager.ListLength("dylan");//队列长度	
string b = redisManager.ListRightPop<string>("dylan");//出队

出队:

redisManager.ListLeftPush("dylan", "sharecore我是入栈的");//入栈	
long len = redisManager.ListLength("dylan");//队列长度	
string b = redisManager.ListLeftPop<string>("key123");//出栈

四、redis hash类型

1、Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

以下是对Hash类型的所有操作方法。

#region Hash	#region 同步方法	/// <summary>	/// 判断某个数据是否已经被缓存	/// </summary>	/// <param name="key"></param>	/// <param name="dataKey"></param>	/// <returns></returns>	public bool HashExists(string key, string dataKey)	{	key = AddSysCustomKey(key);	return Do(db => db.HashExists(key, dataKey));	}	/// <summary>	/// 存储数据到hash表	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <param name="dataKey"></param>	/// <param name="t"></param>	/// <returns></returns>	public bool HashSet<T>(string key, string dataKey, T t)	{	key = AddSysCustomKey(key);	return Do(db =>	{	string json = ConvertJson(t);	return db.HashSet(key, dataKey, json);	});	}	/// <summary>	/// 移除hash中的某值	/// </summary>	/// <param name="key"></param>	/// <param name="dataKey"></param>	/// <returns></returns>	public bool HashDelete(string key, string dataKey)	{	key = AddSysCustomKey(key);	return Do(db => db.HashDelete(key, dataKey));	}	/// <summary>	/// 移除hash中的多个值	/// </summary>	/// <param name="key"></param>	/// <param name="dataKeys"></param>	/// <returns></returns>	public long HashDelete(string key, List<RedisValue> dataKeys)	{	key = AddSysCustomKey(key);	//List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};	return Do(db => db.HashDelete(key, dataKeys.ToArray()));	}	/// <summary>	/// 从hash表获取数据	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <param name="dataKey"></param>	/// <returns></returns>	public T HashGet<T>(string key, string dataKey)	{	key = AddSysCustomKey(key);	return Do(db =>	{	string value = db.HashGet(key, dataKey);	return ConvertObj<T>(value);	});	}	/// <summary>	/// 为数字增长val	/// </summary>	/// <param name="key"></param>	/// <param name="dataKey"></param>	/// <param name="val">可以为负</param>	/// <returns>增长后的值</returns>	public double HashIncrement(string key, string dataKey, double val = 1)	{	key = AddSysCustomKey(key);	return Do(db => db.HashIncrement(key, dataKey, val));	}	/// <summary>	/// 为数字减少val	/// </summary>	/// <param name="key"></param>	/// <param name="dataKey"></param>	/// <param name="val">可以为负</param>	/// <returns>减少后的值</returns>	public double HashDecrement(string key, string dataKey, double val = 1)	{	key = AddSysCustomKey(key);	return Do(db => db.HashDecrement(key, dataKey, val));	}	/// <summary>	/// 获取hashkey所有Redis key	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <returns></returns>	public List<T> HashKeys<T>(string key)	{	key = AddSysCustomKey(key);	return Do(db =>	{	RedisValue[] values = db.HashKeys(key);	return ConvetList<T>(values);	});	}	/// <summary>	/// 	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="key"></param>	/// <returns></returns>	public List<T> HashValues<T>(string key)	{	var result = new List<T>();	key = AddSysCustomKey(key);	return Do(db =>	{	HashEntry[] arr = db.HashGetAll(key);	foreach (var item in arr)	{	if (!item.Value.IsNullOrEmpty)	{	result.Add(JsonConvert.DeserializeObject<T>(item.Value));	}	}	return result;	});	}	#endregion 同步方法	#region 异步方法	直接复制同步的方法,在方法外后面加上Async即可	#endregion 异步方法	#endregion Hash

2、在.netcore 中的调用。

var data = new	
{	name = "dylan",	code = "sharecore",	
};	
bool flag = redisManager.HashExists("dylan", "key1");	
if (!flag)	
{	redisManager.HashSet<object>("dylan", "key1", data);	redisManager.HashSet<object>("dylan", "key2", data);	
}	
var value = redisManager.HashValues<QueueValue>("dylan");

五、redis sorted类型

1、Redis  zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。


以下是对SortedSet类型的所有操作方法。

原码地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs

2、在.netcore中的调用

var data = new	
{	name = "dylan",	code = "sharecore",	
};	
redisManager.SortedSetAdd("dylan", data, 1.0);//添加	
redisManager.SortedSetRemove("dylan",data);//删除	
redisManager.SortedSetRangeByRank<QueueValue>("dylan");//获取全部	
redisManager.SortedSetLength("dylan");//获取数量

六、redis Subscribe 与 Publish

1、Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的通道。

以下是对Subscribe 与 Publish类型的所有操作方法。

#region 发布订阅	/// <summary>	/// Redis发布订阅  订阅	/// </summary>	/// <param name="subChannel"></param>	/// <param name="handler"></param>	public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null)	{	ISubscriber sub = _conn.GetSubscriber();	sub.Subscribe(subChannel, (channel, message) =>	{	if (handler == null)	{	Console.WriteLine(subChannel + " 订阅收到消息:" + message);	}	else	{	handler(channel, message);	}	});	}	/// <summary>	/// Redis发布订阅  发布	/// </summary>	/// <typeparam name="T"></typeparam>	/// <param name="channel"></param>	/// <param name="msg"></param>	/// <returns></returns>	public long Publish<T>(string channel, T msg)	{	ISubscriber sub = _conn.GetSubscriber();	return sub.Publish(channel, ConvertJson(msg));	}	/// <summary>	/// Redis发布订阅  取消订阅	/// </summary>	/// <param name="channel"></param>	public void Unsubscribe(string channel)	{	ISubscriber sub = _conn.GetSubscriber();	sub.Unsubscribe(channel);	}	/// <summary>	/// Redis发布订阅  取消全部订阅	/// </summary>	public void UnsubscribeAll()	{	ISubscriber sub = _conn.GetSubscriber();	sub.UnsubscribeAll();	}	#endregion 发布订阅

2、在.netcore中的调用

订阅:

redisManager.Subscribe("dylan", (channel, value) =>	
{	Console.WriteLine(channel.ToString() + ":" + value.ToString());	
});

发布:

var data = new	
{	name= "dylan",	code = "sharecore"	
};	
redisManager.Publish("dylan", data);

注:如果在是控制台要一直在运行中。

六、redis 数据迁移

1.默认redis数据存放在/var/lib/redis

640?wx_fmt=png

1.保存redis最新数据

[root@localhost ~]# redis-cli	
127.0.0.1:6379 > save 	
127.0.0.1:6379 > quit #退出

3.将dump.rdb传入到新服务器目录/var/lib/redis,重命名为dump.rdb.back

接着进入目录,运行ll命令查看该目录下有一个dump.rdb文件,该文件就是redis数据备份文件:

[root@localhost ~]# cd /var/lib/redis	
[root@localhost redis]# ll

将dump.rdb文件保存,传到新服务器/var/lib/redis目录,重命名为dump.rdb.back。(可以使用FTP)


新服务器

连新服务器,进入到redis数据备份存放的目录:

[root@localhost ~]# cd /var/lib/redis	
[root@localhost redis]# ll

可以看到此时目录下有一个dump.rdb.back文件,先进入redis命令行模式,关闭redis:

[root@localhost ~]# redis-cli	
127.0.0.1:6379 > shutdown #关闭	
127.0.0.1:6379 > quit #退出

接着把dump.rdb.back 复制为dump.rdb:

[root@localhost redis]# cp dump.rdb.back dump.rdb

3、重启新服务器redis服务,完成

[root@localhost redis]# systemctl restart redis

总结

Memcached只能当缓存服务器用,也是最合适的;Redis不仅可以做缓存服务器(性能没有Memcached好),还可以存储业务复杂数据。

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题,有时候需要查询的结果中有通俗的讲解,而且最好还能够带上代码 demo,但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术&#xff…

使用Kubectl部署应用

目录 使用Kubectl部署应用 Kubectl部署流程 部署一个简单的Demo网站 使用Kubectl部署应用一旦运行了Kubernetes集群,就可以在其上部署容器化应用程序。因此在开始之前,我们需要先确保集群已经准备就绪,无论是使用Minikube还是kubeadm创建的集…

Docker系列之.NET Core入门(三)

在Docker生态系统中除了上一节所讲解的基本概念,还有其他专业术语,本文我们将一笔带过,同时会开始陆续进入到在.NET Core中使用Docker。专业术语Docker Engine(Docker引擎):客户端 - 服务器应用程序。Docke…

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)通过Blazor使用C#开发SPA单页面应用程序(3)前面学习了Blazor的特点、环境搭建及基础知识,现在我们尝试的做个实际的组件。Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组…

Mercurial黄昏,Bitbucket宣布全面转向Git

源代码托管平台 Bitbucket 宣布将逐步放弃对版本控制系统 Mercurial 的支持。Bitbucket 推出于 2008 年,当时集中式版本控制是比较普遍的,Mercurial 是其中的典型代表,但是当前 Git 才是主流,它已经成为了大部分开源项目的首选版本…

使用 Azure DevTest Lab 搭建云端开发测试环境

点击上方蓝字关注“汪宇杰博客”导语程序员和测试工程师经常需要自己搭环境用于开发和测试目的,这些机器可能只会使用很短一段时间。通常我们会在本机使用 Hyper-V、VMWare 之类的虚拟机产品,或者使用企业IT管理员分配的虚拟机去完成这项工作。然而安装配…

dotNET Core WebAPI 统一处理(返回值、参数验证、异常)

现在 Web 开发比较流行前后端分离现在 Web 开发比较流行前后端分离,我们的产品也是一样,前端使用Vue,后端使用 dotNet Core WebAPI ,在写 API 的过程中有很多地方需要统一处理文档参数验证返回值异常处理本文就说说 API 的统一处理…

.net测试篇之单元测试/集成测试神器Autofixture

autofixture简介有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixture并且它能与moq,rhinomock等框架结合,对单元测试带来的便捷性,可维护性和扩展性更是难以言表,只有用用了…

DotNetCore 3.0 助力 WPF本地化

概览随着我们的应用程序越来越受欢迎,我们的下一步将要开发多语言功能。方便越来越多的国家使用我们中国的应用程序,基于 WPF 本地化,我们很多时候使用的是系统资源文件,可是动态切换本地化,就比较麻烦了。实现思路现在…

开源题材征集 + MVCEF Core 完整教程小结

到目前为止,我们的MVCEF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点。下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目。现向园友征集题材,你提需…

对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起

看到一篇公众号文章《2020年什么编程语言最受欢迎,待遇最高?》,其中对C#的描述如下:点击阅读原文,看到这是一篇翻译文章:https://codinginfinite.com/top-programming-languages-2020-stats-surveys/这篇文…

ASP.NET Core on K8S深入学习(6)Health Check

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。预计阅读时间为10分钟。01—关于K8S中的健康监测所谓Health Check,就是健康检查,即防微杜渐。K8S是一个编排引擎可以帮助我们快捷地部署容器集…

关于 .Net Core runtimeconfig 文件说明

项目的bin\debug\netcoreapp${Version}下面能够找到这个${AppName}.runtimeconfig.json文件,简单来说,它就是用来定义应用程序所用的共享框架(.Net Core App)以及运行时选项 的一个文件。一个简单的例子{ "runtimeOptions&q…

net core 3.0 之Grpc新特性小试牛刀

作者: 相信微服务大家伙都有听说和知道,好处弊端咱也不多说了,Grpc算是一个比较全面的微服务框架,也得到微软的支持总结下来就是,跨平台,可靠,通信快,扩展性强,网络消耗小…

CF1168D Anagram Paths(由必要到充分/虚树)

CF1168D Anagram Paths 对于这道题首先有一个关键的性质,那就是对于一个树,它是可重排的,当且仅当在树上任意一个节点,所有字母在相关联的字符串中出现次数最大值之和小于当前点到叶子的距离。这个性质可以通过归纳证明&#xff0…

基于Coravel定时任务之计算总页数

在物联网系统中,需要计算底端所有设备的总数,除以分页每页显示数量,进行一个总页数的显示。包括状态,告警,日志等等数据都需要对应的总页数的显示。2.1 TaskSchedulerTaskScheduler库只支持.net,且需要结合…

Docker系列之AspNetCore Runtime VS .NetCore Runtime VS SDK(四)

接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了,如题在开始之前,我们需要搞清楚一些概念,要不然看到官方提供如下一系列镜像,我们会一脸懵逼,不知道到底要使用哪一个。AspNetCore Runtime VS .NetCore Runti…

.NET Core跨平台部署于Docker(Centos)- 视频教程

.NET Core跨平台部署于Docker,Docker部署于Centos中,演示跨平台特性!以下视频教程,请带上耳机开始聆听往期教程:.NET开发框架(一)-框架介绍与视频演示.NET开发框架(二)-框架功能简述.NET开发框架(三)-高可用服务器端设计.NET开发框…

【清华集训2014】Sum)(类欧几里得算法)

【清华集训2014】Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性,然后我们发现这个式子很像是类欧几里得算法,求解一个斜率为无理数直线下的整点个数,然后我们直接对于一般形式求解,那么就是每次利用整数部分将斜率减小…

一本让我多花2倍时间读的书

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「87」篇原创敬上Hi,大家好,我是Z哥。熟悉我的小伙伴应该知道,我平时看书大多都很快,之前还把自己的速读技巧分享给了…