.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,一经查实,立即删除!

相关文章

二次剩余模板

二次剩余模板 x2≡n(modp)x ^ 2 \equiv n \pmod px2≡n(modp) /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>#define mp make_pair #define pb push_back #define endl \n #define mid (l r >> 1) #define l…

CF938G Shortest Path Queries(线性基/线段树分治/异或)

CF938G Shortest Path Queries 支持加边删边和查询两点之间的异或最短路&#xff0c;我们可以使用线段树分治&#xff0c;然后利用线性基求解。 但是这里图可能不是联通的&#xff0c;所以查询两点之间的异或和需要边带权并查集维护&#xff0c;然后还不能路径压缩&#xff0…

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

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

P2487 [SDOI2011]拦截导弹(cdq分治/计数问题思想)

P2487 [SDOI2011]拦截导弹 求解二维上的LIS&#xff0c;并且要求出每个点的选中概率。 首先对于每个点的选中概率&#xff0c;可以通过方案数计算&#xff0c;那么就是选中它的方案数除以总方案数。关键在于选中它的方案数怎么求&#xff0c;可以通过以它开头的LIS方案数和以…

dsu on tree 题集 + ac代码

文章目录**入门讲解****[600E - Lomsat gelral](https://codeforces.ml/problemset/problem/600/E)****[树上数颜色](https://www.luogu.org/problemnew/show/U41492)****[570D - Tree Requests](https://codeforces.ml/problemset/problem/570/D)****[ 阔力梯的树](https://ac…

使用Kubectl部署应用

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

SP22343 NORMA2 - Norma(分治优化复杂度)

SP22343 NORMA2 - Norma 一看就像是一个序列分治的题目&#xff0c;求解序列上区间长度乘区间最大值最小值的和&#xff0c;然后考虑如何处理&#xff0c;分治之后每次就可以将右边部分分成三部分&#xff0c;然后对于这三部分可以批量求和&#xff0c;这样就起到优化复杂度的…

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

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

P3911 最小公倍数之和 (atcoder C - LCMs)(反演)

P3911 最小公倍数之和 推式子 ∑i1n∑j1nlcm(ai,aj)下面的nmax(ai)&#xff0c;ci为i在原数组中出现的次数∑i1n∑j1nijgcd(ij)cicj∑d1n1d∑i1n∑j1nijcicj(gcd(i,j)d)∑d1nd∑i1nd∑j1ndijcidcjd∑k∣gcd(i,j)μ(k)∑d1nd∑k1ndμ(k)k2∑i1nkd∑j1nkdijcikdcjkd∑t1nt(∑i1n…

P5502 [JSOI2015]最大公约数(gcd性质/min性质/分治)

P5502 [JSOI2015]最大公约数 对于求解(r-l1)*gcd(l,r)的最大值&#xff0c;首先我们有一个性质&#xff0c;就是一个前缀的gcd本质不同个数只有log个&#xff0c;所以我们可以利用这个性质&#xff0c;然后每次分治处理&#xff0c;每一层的复杂度可以做到O(n)因为枚举前缀后缀…

2019南昌网络赛G. tsy‘s number(反演 + 积性函数O(n)预处理)

tsy’s number 推式子 ∑i1n∑j1n∑k1nϕ(i)ϕ(j2)ϕ(k3)ϕ(i)ϕ(j)ϕ(k)ϕ(gcd(i,j,k))我们假定jp1k1p2k2p3p3……pnkn&#xff0c;有ϕ(j)p1k1−1(p1−1)p2k2−1(p2−1)p3k3−1(p3−1)……pnkn−1(pn−1)&#xff0c;ϕ(j2)p12k1−1(p1−1)p22k2−1(p2−1)p32k3−1(p3−1)……

#2989. 数列(cdq分治/曼哈顿距离)

#2989. 数列 给定一个长度为n的正整数数列a[i]。 定义2个位置的graze值为两者位置差与数值差的和&#xff0c;即graze(x,y)|x-y||a[x]-a[y]|。 2种操作&#xff08;k都是正整数&#xff09;&#xff1a; 1.Modify x k&#xff1a;将第x个数的值修改为k。 2.Query x k&#xff…

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

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

POJ 1741 Tree(点分治)

POJ 1741 Tree 思路 男人八题中的一题&#xff0c;写完这题算是18\frac{1}{8}81​个男人了&#xff01; 这题是树上距离的计数问题&#xff0c;能够通过巧妙地排序加双指针来解决&#xff0c; 统计距离应该大家都会地&#xff0c;我就来说明一下如何计数吧。 假设我们已经求…

P1975 [国家集训队]排队(三维偏序)

P1975 [国家集训队]排队 查询逆序对数目&#xff0c;交换两个数的位置 首先逆序对是一个经典的二维偏序问题&#xff0c;然后现在问题变为静态&#xff0c;我们可以使用三维偏序来处理多出来的限制。或者也可以使用带修主席树处理。

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

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

HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)

HDU 4812 D Tree 思路 点对距离相等并且要求输出字典序最小的点对&#xff0c;距离相等不就是点分治裸题了嘛&#xff0c; 照着这个思路出发我们只要记录下所有点对是满足要求的&#xff0c;然后再去找字典序最小的点对就行了&#xff0c; 接下来就是考虑如何求最小点对了&…

P2754 [CTSC1999]家园 / 星际转移问题(网络流)

P2754 [CTSC1999]家园 / 星际转移问题 经典问题&#xff0c;利用分层图来跑网络流。

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

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