Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.net core redis的全套操作

.net core redis的全套操作

作者头像
hailang2zh
发布于 2019-08-29 09:43:00
发布于 2019-08-29 09:43:00
1.5K00
代码可运行
举报
文章被收录于专栏:dotNET名人堂dotNET名人堂
运行总次数:0
代码可运行

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的软件源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

安装redis

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum --enablerepo=remi install redis

启动redis

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl start redis

设置redis开机启动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl enable redis

二、redis string类型

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
原码地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs

2、在.netcore 中的调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var flag = redisManager.StringSet("dylan", "公众号为:sharecore");v
ar value = redisManager.StringGet("dylan");Console.WriteLine($"获取缓存值为:{value}");

三、redis list 类型

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

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

List类型的所有操作方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 中的调用。

入队:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redisManager.ListRightPush("dylan", "sharecore我是入队的");//入队
long len = redisManager.ListLength("dylan");//队列长度
string b = redisManager.ListRightPop<string>("dylan");//出队

出队:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类型的所有操作方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 中的调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类型的所有操作方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
原码地址:https://github.com/hailang2ll/DMS/blob/master/src/DMS.Core/DMS.Redis/RedisManager.cs

2、在.netcore中的调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类型的所有操作方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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中的调用

订阅:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redisManager.Subscribe("dylan", (channel, value) =>
{
    Console.WriteLine(channel.ToString() + ":" + value.ToString());
});

发布:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var data = new
{
    name= "dylan",
    code = "sharecore"
};
redisManager.Publish("dylan", data);

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

六、redis 数据迁移

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

1.保存redis最新数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# redis-cli127.0.0.1:6379 > save 127.0.0.1:6379 > quit #退出

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# cd /var/lib/redis[root@localhost redis]# ll

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

新服务器

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# cd /var/lib/redis[root@localhost redis]# ll

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# redis-cli127.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好),还可以存储业务复杂数据。

欢迎在文章下方留言与我讨论,感谢您的阅读

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
StackExchange.Redis通用封装类分享
首先是 ConnectionMultiplexer 的封装,ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象。这个类的实例需要被整个应用程序域共享和重用的,所以不需要在每个操作中不停的创建该对象的实例,一般都是使用单例来创建和存放这个对象,这个在官网上也有说明。
yaphetsfang
2020/07/30
1.4K0
StackExchange.Redis通用封装类分享
分布式中使用Redis实现Session共享(一)
用户1168362
2018/01/05
2.3K0
分布式中使用Redis实现Session共享(一)
c# RedisHelper
使用redis组件如下,至于为什么使用3.9版本,是因为4.0开始商业了,限制了次数
冰封一夏
2019/09/11
2K0
Redis介绍使用及进阶
1、 高性能-- Redis能读的速度是110000次/s,写的速度是81000次/s 、c语言实现距离系统更近、数据存储在内存中、采用了epoll,非阻塞I/O,
小世界的野孩子
2019/09/11
6580
StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用程序应该只有一个ConnectionMultiplexer 类的实例。上一章中StackExchangeRedisHelper 的相关代码如下 private static ConnectionMultiplexer _instance = null; /// <summary>
蓝夏
2018/05/02
1.6K0
StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
asp.net core 上使用redis探索(3)--redis示例demo
由于是基于.net-core平台,所以,我们最好是基于IDistributedCache接口来实现。ASP.NET-CORE下的官方redis客户端实现是基于StackExchange的。但是官方提供的IDistributeCache接口中的方法只是增删改查,我们可以继续拓展,增加订阅/发布,消息队列,当然这些方法必须是基于底层的StackExchange相对应的方法来做的。 如果我们要实现自己的Redis客户端,同时不使用底层的StackExchange驱动,可以派生一个继承自IDistributedCache的接口,定义自己需要的方法,例如:
Ryan_OVO
2023/10/19
3120
Redis学习系列二之.Net开发环境搭建及基础数据结构String字符串
Redis有5种基本数据结构,分别是string、list(列表)、hash(字典)、set(集合)、zset(有序集合),这是必须掌握的5种基本数据结构.注意Redis作为一个键值对缓存系统,其所有的数据结构,都以唯一的key(字符串)作为名称,然后通过key来获取对应的数据.
郑小超.
2018/12/28
6730
【BCVP】实现基于 Redis 的消息队列
如果自己学不动了,或者感觉没有动力的时候,看看书,听听音乐,跑跑步,休息两天,重新出发,偷懒虽好,可不要贪杯。
老张的哲学
2022/04/11
3580
【BCVP】实现基于 Redis 的消息队列
C# 通过ServiceStack 操作Redis——String类型的使用及示例
我这里就用别人已经封装好的Reids操作类来和大家一起参考了下,看看怎么使用ServiceStack.Redis 操作Redis数据
明志德道
2023/10/21
3710
C# 通过ServiceStack 操作Redis——String类型的使用及示例
asp.net性能优化之使用Redis缓存(入门)
1.1对于大量的数据读取,为了缓解数据库的压力将一些不经常变化的而又读取频繁的数据存入redis缓存
张哥编程
2024/12/21
910
Redis缓存服务搭建及实现数据读写
发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached、Redis、mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下。由于小弟水平有限又是第一次接触Redis,有些的不对的地方欢迎指出纠正。
写代码的猿
2019/04/11
6790
Redis缓存服务搭建及实现数据读写
Redis学习系列四Hash(字典)
Redis中的Hash字典相当于C#中的Hashtable,是一种无序字典,内存存储了很对的键值对,实现上和Hashtable一样,都是"数组+链表"二维结构,都是对关键字(键值)进行散列操作,讲关键字散列到Hashtable中的某一个槽位中去,这个过程中如果发生了碰撞,散列函数可能将不同的关键字散列到Hashtable中的同一个槽位中去,通过"链表的方式"进行连接。
郑小超.
2018/12/28
6340
【愚公系列】2022年11月 .NET CORE工具案例-StackExchange.Redis代码变量方式实现商品秒杀
文章目录 前言 一、StackExchange.Redis执行Lua脚本实现商品秒杀 1.StackExchange.Redis封装 2.秒杀代码 3.效果 ---- 前言 下面是Redis分布式锁常用的概念说明:设置、获取、过期时间、删除。 1、 Setnx 命令:SETNX key value 说明:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简
愚公搬代码
2022/11/28
5430
【愚公系列】2022年11月 .NET CORE工具案例-StackExchange.Redis代码变量方式实现商品秒杀
Redis--Memched--Cache缓存介绍使用
Redis:支持String(字符串)、Hash(哈希)、List(列表)、Set(集合)、 ZSet(有序集合)、Bitmaps(位图)、HyperLogLog、Geo(地理信息定位)
小世界的野孩子
2019/09/11
8370
Redis学习系列六ZSet(有序列表)及Redis数据结构的过期
ZSet可以说是Redis中最有趣的数据结构了,因为他兼具了Hash集合和Set的双重特性,也是用的最多的,保证了value值的唯一性的同时,,同时又保证了高性能,最主要的是还可以给每个Value设置Source(权重),那么我们就可以通过权重进行排序,这在业务上是非常常见的,比如很多地方需要,比如我们需要对所有用户的数学成绩进行排序.对英语等等地例子比比皆是,那么通过ZSet,你将会得到一个响应速度非常快的过程.下面会介绍.
郑小超.
2018/12/28
1.9K0
四、对.Net Collection进行拓展
Example: private readonly int[] array = new int[5] { 1, 3, 5, 2, 4 }; private void Start() { array.ForEach(m => Debug.Log(m)); array.ForEachReverse(m => Debug.Log(m)); array.Merge(new int[2] { 1, 2 }); List<int> list = array.ToList();
CoderZ
2022/08/29
1850
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
红目香薰
2022/11/30
8850
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
.net平台的MongoDB使用
  最近花了点时间玩了下MongoDB.Driver,进行封装了工具库,平常也会经常用到MongoDB,因此写一篇文章梳理知识同时把自己的成果分享给大家。
陈珙
2018/09/12
8820
.net平台的MongoDB使用
StackExchange.Redis学习笔记(一) Redis的使用初探
  官网只提供了linux的安装包,我win10 的系统,在github上下载的windows安装包 3.0.504最新稳定版的
蓝夏
2022/03/10
1.2K0
StackExchange.Redis学习笔记(一) Redis的使用初探
Redis学习系列三List列表
Redis中的列表相当于C#中的LinkedList,也就是链表,如果你研究过链表这个数据结构,肯定知道.它的插入和删除是非常快的,但是定位却很慢,因为必须遍历所有的元素,才能找到对应的值,所以当你需要对列表进行统计的时候,建立跑后台服务去做,而不是使用Redis去遍历,因为开销很大.
郑小超.
2018/12/28
6960
推荐阅读
相关推荐
StackExchange.Redis通用封装类分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验