我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis学习笔记:C#中的使用

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis学习笔记:C#中的使用

Redis学习笔记:C#中的使用

    1、新建一个WinForm窗体,命名为Main:

    2、在NuGet中安装StackExchange.Redis。

    3、添加一个类,命名为RedisHelper。

    public static class RedisHelper
    {
        private static string Constr = "";
        private static readonly object _locker = new object();
        private static ConnectionMultiplexer _instance = null;

        /// 
        /// 使用一个静态属性来返回已连接的实例,如下列中所示。这样,一旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。
        /// 
        public static ConnectionMultiplexer Instance
        {
            get
            {
                if (Constr.Length == 0)
                {
                    throw new Exception("连接字符串未设置!");
                }
                if (_instance == null)
                {
                    lock (_locker)
                    {
                        if (_instance == null || !_instance.IsConnected)
                        {
                            _instance = ConnectionMultiplexer.Connect(Constr);
                        }
                    }
                }
                //注册如下事件
                _instance.ConnectionFailed += MuxerConnectionFailed;
                _instance.ConnectionRestored += MuxerConnectionRestored;
                _instance.ErrorMessage += MuxerErrorMessage;
                _instance.ConfigurationChanged += MuxerConfigurationChanged;
                _instance.HashSlotMoved += MuxerHashSlotMoved;
                _instance.InternalError += MuxerInternalError;
                return _instance;
            }
        }

        static RedisHelper()
        {
        }

        public static void SetCon(string config)
        {
            Constr = config;
        }

        public static IDatabase GetDatabase()
        {
            return Instance.GetDatabase();
        }

        /// 
        /// 这里的 MergeKey 用来拼接 Key 的前缀,具体不同的业务模块使用不同的前缀。
        /// 
        /// 
        /// 
        private static string MergeKey(string key)
        {
            return key;
            //return BaseSystemInfo.SystemCode + key;
        }

        /// 
        /// 根据key获取缓存对象
        /// 
        /// 
        /// 
        /// 
        public static T Get(string key)
        {
            key = MergeKey(key);
            return Deserialize(GetDatabase().StringGet(key));
        }

        /// 
        /// 根据key获取缓存对象
        /// 
        /// 
        /// 
        public static object Get(string key)
        {
            key = MergeKey(key);
            return Deserialize<object>(GetDatabase().StringGet(key));
        }

        /// 
        /// 设置缓存
        /// 
        /// 
        /// 
        /// 
        public static void Set(string key, object value, int expireMinutes = 0)
        {
            key = MergeKey(key);
            if (expireMinutes > 0)
            {
                GetDatabase().StringSet(key, Serialize(value), TimeSpan.FromMinutes(expireMinutes));
            }
            else
            {
                GetDatabase().StringSet(key, Serialize(value));
            }
        }

        /// 
        /// 判断在缓存中是否存在该key的缓存数据
        /// 
        /// 
        /// 
        public static bool Exists(string key)
        {
            key = MergeKey(key);
            return GetDatabase().KeyExists(key); //可直接调用
        }

        /// 
        /// 移除指定key的缓存
        /// 
        /// 
        /// 
        public static bool Remove(string key)
        {
            key = MergeKey(key);
            return GetDatabase().KeyDelete(key);
        }

        /// 
        /// 异步设置
        /// 
        /// 
        /// 
        public static async Task SetAsync(string key, object value)
        {
            key = MergeKey(key);
            await GetDatabase().StringSetAsync(key, Serialize(value));
        }

        /// 
        /// 根据key获取缓存对象
        /// 
        /// 
        /// 
        public static async Task<object> GetAsync(string key)
        {
            key = MergeKey(key);
            object value = await GetDatabase().StringGetAsync(key);
            return value;
        }

        /// 
        /// 实现递增
        /// 
        /// 
        /// 
        public static long Increment(string key)
        {
            key = MergeKey(key);
            //三种命令模式
            //Sync,同步模式会直接阻塞调用者,但是显然不会阻塞其他线程。
            //Async,异步模式直接走的是Task模型。
            //Fire - and - Forget,就是发送命令,然后完全不关心最终什么时候完成命令操作。
            //即发即弃:通过配置 CommandFlags 来实现即发即弃功能,在该实例中该方法会立即返回,如果是string则返回null 如果是int则返回0.这个操作将会继续在后台运行,一个典型的用法页面计数器的实现:
            return GetDatabase().StringIncrement(key, flags: CommandFlags.FireAndForget);
        }

        /// 
        /// 实现递减
        /// 
        /// 
        /// 
        /// 
        public static long Decrement(string key, string value)
        {
            key = MergeKey(key);
            return GetDatabase().HashDecrement(key, value, flags: CommandFlags.FireAndForget);
        }

        /// 
        /// 序列化对象
        /// 
        /// 
        /// 
        private static byte[] Serialize(object o)
        {
            if (o == null)
            {
                return null;
            }
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            using (MemoryStream memoryStream = new MemoryStream())
            {
                binaryFormatter.Serialize(memoryStream, o);
                byte[] objectDataAsStream = memoryStream.ToArray();
                return objectDataAsStream;
            }
        }

        /// 
        /// 反序列化对象
        /// 
        /// 
        /// 
        /// 
        private static T Deserialize(byte[] stream)
        {
            if (stream == null)
            {
                return default(T);
            }
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            using (MemoryStream memoryStream = new MemoryStream(stream))
            {
                T result = (T)binaryFormatter.Deserialize(memoryStream);
                return result;
            }
        }

        /// 
        /// 配置更改时
        /// 
        /// 
        /// 
        private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
        {
            //LogHelper.SafeLogMessage("Configuration changed: " + e.EndPoint);
        }

        /// 
        /// 发生错误时
        /// 
        /// 
        /// 
        private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
        {
            //LogHelper.SafeLogMessage("ErrorMessage: " + e.Message);
        }

        /// 
        /// 重新建立连接之前的错误
        /// 
        /// 
        /// 
        private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
        {
            //LogHelper.SafeLogMessage("ConnectionRestored: " + e.EndPoint);
        }

        /// 
        /// 连接失败,如果重新连接成功你将不会收到这个通知。
        /// 
        /// 
        /// 
        private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
        {
            //LogHelper.SafeLogMessage("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType +(e.Exception == null ? "" : (", " + e.Exception.Message)));
        }

        /// 
        /// 更改集群
        /// 
        /// 
        /// 
        private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
        {
            //LogHelper.SafeLogMessage("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);
        }

        /// 
        /// redis类库错误
        /// 
        /// 
        /// 
        private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
        {
            //LogHelper.SafeLogMessage("InternalError:Message" + e.Exception.Message);
        }

        //场景不一样,选择的模式便会不一样,大家可以按照自己系统架构情况合理选择长连接还是Lazy。
        //建立连接后,通过调用ConnectionMultiplexer.GetDatabase 方法返回对 Redis Cache 数据库的引用。从 GetDatabase 方法返回的对象是一个轻量级直通对象,不需要进行存储。

        /// 
        /// 使用的是Lazy,在真正需要连接时创建连接。
        /// 延迟加载技术
        /// 微软azure中的配置 连接模板
        /// 
        //private static Lazy lazyConnection = new Lazy(() =>
        //{
        //    //var options = ConfigurationOptions.Parse(constr);
        //    ////options.ClientName = GetAppName(); // only known at runtime
        //    //options.AllowAdmin = true;
        //    //return ConnectionMultiplexer.Connect(options);
        //    ConnectionMultiplexer muxer = ConnectionMultiplexer.Connect(Coonstr);
        //    muxer.ConnectionFailed += MuxerConnectionFailed;
        //    muxer.ConnectionRestored += MuxerConnectionRestored;
        //    muxer.ErrorMessage += MuxerErrorMessage;
        //    muxer.ConfigurationChanged += MuxerConfigurationChanged;
        //    muxer.HashSlotMoved += MuxerHashSlotMoved;
        //    muxer.InternalError += MuxerInternalError;
        //    return muxer;
        //});


        #region  当作消息代理中间件使用 一般使用更专业的消息队列来处理这种业务场景

        /// 
        /// 当作消息代理中间件使用
        /// 消息组建中,重要的概念便是生产者、消费者、消息中间件。
        /// 
        /// 
        /// 
        /// 
        public static long Publish(string channel, string message)
        {
            ISubscriber sub = Instance.GetSubscriber();
            //return sub.Publish("messages", "hello");
            return sub.Publish(channel, message);
        }

        /// 
        /// 在消费者端得到该消息并输出
        /// 
        /// 
        /// 
        public static void Subscribe(string channelFrom)
        {
            ISubscriber sub = Instance.GetSubscriber();
            sub.Subscribe(channelFrom, (channel, message) =>
            {
                Console.WriteLine(message);
            });
        }

        #endregion

        /// 
        /// GetServer方法会接收一个EndPoint类或者一个唯一标识一台服务器的键值对
        /// 有时候需要为单个服务器指定特定的命令
        /// 使用IServer可以使用所有的shell命令,比如:
        /// DateTime lastSave = server.LastSave();
        /// ClientInfo[] clients = server.ClientList();
        /// 如果报错在连接字符串后加 ,allowAdmin=true;
        /// 
        /// 
        public static IServer GetServer(string host, int port)
        {
            IServer server = Instance.GetServer(host, port);
            return server;
        }

        /// 
        /// 获取全部终结点
        /// 
        /// 
        public static EndPoint[] GetEndPoints()
        {
            EndPoint[] endpoints = Instance.GetEndPoints();
            return endpoints;
        }
    }
View Code

    4、Main窗体代码:

    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();

            try
            {
                string redisconf = "127.0.0.1:6379,password=12345,DefaultDatabase=0";
                RedisHelper.SetCon(redisconf);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /// 
        /// 设置
        /// 
        /// 
        /// 
        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                textBox4.Text = "请填写键";
                return;
            }
            if (string.IsNullOrEmpty(textBox2.Text))
            {
                textBox4.Text = "请填写值";
                return;
            }
            if (string.IsNullOrEmpty(textBox3.Text))
            {
                textBox4.Text = "请填写过期时间";
                return;
            }

            //键、值、过期时间
            RedisHelper.Set(textBox1.Text, textBox2.Text, int.Parse(textBox3.Text));
            textBox4.Text = "添加成功";
        }

        /// 
        /// 删除
        /// 
        /// 
        /// 
        private void button2_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(textBox1.Text))
            {
                if (RedisHelper.Exists(textBox1.Text))
                {
                    RedisHelper.Remove(textBox1.Text).ToString();
                    textBox4.Text = "删除成功";
                }
                else
                {
                    textBox4.Text = "已过期或不存在";
                }
            }
            else
            {
                textBox4.Text = "请填写键";
            }
        }

        /// 
        /// 获取
        /// 
        /// 
        /// 
        private void button3_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(textBox1.Text))
            {
                if (RedisHelper.Exists(textBox1.Text))
                {
                    textBox4.Text = RedisHelper.Get(textBox1.Text).ToString();
                }
                else
                {
                    textBox4.Text = "已过期或不存在";
                }
            }
            else
            {
                textBox4.Text = "请填写键";
            }
        }

        /// 
        /// 分钟数--非Backspace键或数字时处理
        /// 
        /// 
        /// 
        private void TextBox3_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar != 8 && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
        }
    }
View Code

    5、运行结果:

 

    参考自:

    https://blog.csdn.net/wu_zongwen/article/details/80318916

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis学习笔记:C#中的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis学习笔记:C#中的使用

1、新建一个WinForm窗体,命名为Main:    2、在NuGet中安装StackExchange.Redis。    3、添加一个类,命名为RedisHelper。 public static class RedisHelper {
Redis学习笔记:C#中的使用
2016-08-05

Redis学习笔记:Redis在C#中的使用

1、新建一个WinForm窗体,命名为Main:    2、在NuGet中安装StackExchange.Redis。    3、添加一个类,命名为RedisHelper。 public static class RedisHelper {
Redis学习笔记:Redis在C#中的使用
2017-01-15

Objective-C的UIColor学习笔记

UIColor是Objective-C中的一个类,用于表示颜色。在iOS开发中,我们经常会使用UIColor来设置视图的背景色、文本颜色等属性。1. 创建UIColor对象我们可以使用以下方法来创建UIColor对象:- 使用RGB值来创建
2023-09-28

Redis学习笔记:Windows下的安装

一、Redis下载    官网下载地址:http://redis.io/download    GitHub下载地址:https://github.com/MSOpenTech/redis/tags    备注:现在的Redis官网没有Windows版的下载链
Redis学习笔记:Windows下的安装
2021-10-14

Redis学习笔记:Redis在Windows下的安装

一、Redis下载    官网下载地址:http://redis.io/download    GitHub下载地址:https://github.com/MSOpenTech/redis/tags    备注:现在的Redis官网没有Windows版的下载链
Redis学习笔记:Redis在Windows下的安装
2019-02-14

Redis学习笔记(十五)Sentinel(哨兵)(中)

上一篇 我们模拟了单机器下哨兵模式的搭建,那么接下来我们看下哨兵模式的实现与工作。为什么又分成两篇呢?因为篇幅太长(偷懒),再一个这篇主要说的是Sentinel的初始化以及信息交换,下一篇着重说下状态检查、Sentinel头领选举与故障转移 。启动并初始化Se
Redis学习笔记(十五)Sentinel(哨兵)(中)
2020-07-22

[学习笔记] RabbitMQ的安装使用

安装使用命令行安装,会自动管理依赖(推荐):choco install rabbitmq安装包安装:以管理员身份安装64位的 Erlang。下载并安装 RabbitMQ 服务。下载地址。RabbitMQ 会作为 Windows 服务安装并默认启动。可以在开始菜
[学习笔记] RabbitMQ的安装使用
2019-01-10

[学习笔记] RabbitMQ的简单使用

安装依赖# composer.json{ "require": { "php-amqplib/php-amqplib": ">=2.9.0" }}> composer.phar install [|||] -> (C)" />生产者#
[学习笔记] RabbitMQ的简单使用
2017-02-07

Python学习笔记(二):使用Pyth

1.目的:2.安装XlsxWriter3.xlsxwriter常用功能:4.在Excel中写数据:4.1 一维表格生成1.目的:用xlwt来生成excel的,生成的后缀名为xls,在xlwt中生成的xls文件最多能支持65536行数据。 p
2023-01-31

Python3学习笔记:Python中的

一、格式变量 = 对象二、简述Python为动态解释性语言,在赋值操作时,并不需要像静态编译类型语言C、C++或Java一样,在使用变量前,需声明变量的类型。在Python中,类型是在运行过程中自动决定的,而不是通过代码声明。这意味着没有必
2023-01-31

shell中case的用法学习笔记

shell中的case语句:可以把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码。 使用格式:case 匹配母板 in模板1 [ | 模板2 ] … ) 语句组 ;;模板3 [ | 模板4 ] … ) 语句组 ;
2022-06-04

在Python学习笔记中如何使用FTP类

在Python学习笔记中如何使用FTP类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如果你在Python学习笔记的实际应用过程中遇到在Python学习笔记中FTP类的常用方法
2023-06-17

PHP学习笔记:数组的使用与操作

导言:数组是一种常用的数据结构,在PHP中也是一个重要的数据类型。掌握数组的使用与操作,可以帮助我们更好地组织和处理数据。本篇文章将介绍数组的基本概念、创建与初始化数组、访问数组元素、添加与删除数组元素、数组的遍历与排序等操作,并附上具体的
2023-10-21

Python中函数参数设置及使用的学习笔记

一、参数和共享引用:In [56]: def changer(a,b):....: a=2....: b[0]='spam'....: In [57]: X=1 In [59]: L=[1,2] In [60]: change
2022-06-04

编程热搜

目录