c# 使用StackExchange.Redis 发布订阅功能

业务场景

举个例子:业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力 

 

发布示例

            for (var i = 1; i < 20; i++) {

                Redis.Using(rd => { rd.Use(1).RedisPub<string>("redis_20190605_pay", "pay amt=" + i); });

                Thread.Sleep(200);

            }

 

订阅示例

        private static Redis redis;

        static void Main(string[] args) {

            redis = new Redis();
            redis.RedisSubMessageEvent += RedisSubMessageEvent;
            redis.Use(1).RedisSub("redis_20190605_pay");

            Console.ReadKey();

       }

        private static void RedisSubMessageEvent(string msg) {

            Console.Write($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")} RedisSubMessageEvent: {msg}");
        }

 

效果图

 

 

StackExchange.Redis封装的类

using System;
using System.Collections.Generic;
using System.Linq;
using StackExchange.Redis;

namespace Utils.Framework {

    public class Redis : IDisposable {

        private static ConnectionMultiplexer redis = null;
        private static bool connected = false;
        private IDatabase db = null;
        private int current = 0;
        public static bool IsConnected { get { Open(); return redis.IsConnected; } }
        public static bool Test() {
            bool r = true;
            try {
                Redis.Using(rs => { rs.Use(0); });
            } catch (Exception e) {
                Log.Logs("[Redis] test fail " + e.Message);
                r = false;
            }
            if (r) Log.Logs("[Redis] test ok.");
            return r;
        }
        private static int Open() {
            if (connected) return 1;
            redis = ConnectionMultiplexer.Connect("localhost:6379,password=123456,abortConnect = false");
            connected = true;
            return 1;
        }
        public static void Using(Action<Redis> a) {
            using (var red = new Redis()) {
                a(red);
            }
        }
        public Redis Use(int i) {
            Open();
            current = i;
            db = redis.GetDatabase(i);

            //Log.Logs($"RedisDB Conntet State: {redis.IsConnected}");
            var t = db.Ping();
            //Log.Logs($"RedisDB Select {i}, Ping.{t.TotalMilliseconds}ms");
            return this;
        }

        public void Set(string key, string val, TimeSpan? ts = null) {
            db.StringSet(key, val, ts);
        }

        public string Get(string key) {
            return db.StringGet(key);
        }

        public void Remove(string key) {
            db.KeyDelete(key, CommandFlags.HighPriority);
        }

        public bool Exists(string key) {
            return db.KeyExists(key);
        }

        public void Dispose() {
            db = null;
        }

        #region Redis发布订阅

        public delegate void RedisDeletegate(string str);
        public event RedisDeletegate RedisSubMessageEvent;

        /// <summary>
        /// 订阅
        /// </summary>
        /// <param name="subChannel"></param>
        public void RedisSub(string subChannel) {

            redis.GetSubscriber().Subscribe(subChannel, (channel, message) => {
                RedisSubMessageEvent?.Invoke(message); //触发事件

            });

        }

        /// <summary>
        /// 发布
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="channel"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public long RedisPub<T>(string channel, T msg) {

            return redis.GetSubscriber().Publish(channel, msg.Json());
        }

        /// <summary>
        /// 取消订阅
        /// </summary>
        /// <param name="channel"></param>
        public void Unsubscribe(string channel) {
            redis.GetSubscriber().Unsubscribe(channel);
        }

        /// <summary>
        /// 取消全部订阅
        /// </summary>
        public void UnsubscribeAll() {
            redis.GetSubscriber().UnsubscribeAll();
        }

        #endregion
    }
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用StackExchange.Redis需要引用以下几个DLL文件: 1. StackExchange.Redis.dll: 这是StackExchange.Redis库的核心DLL文件,包含Redis的连接、命令执行等功能的实现。 2. StackExchange.Redis.Extensions.Core.dll: 这是StackExchange.Redis的扩展库的核心DLL文件,提供了一些常用的扩展方法和功能。 3. Newtonsoft.Json.dll: 这是Json.NET库的DLL文件,StackExchange.Redis使用Json.NET来进行序列化和反序列化,需要引用此DLL文件。 引用这些DLL文件之前,需要先从官方网站或通过NuGet下载并安装StackExchange.Redis库。在Visual Studio中创建项目后,右键点击项目,选择“管理NuGet程序包”,搜索并安装StackExchange.Redis。安装完成后,会自动添加以上所述的DLL文件到项目引用中。 在项目中使用StackExchange.Redis时,首先需要在代码中添加相应的命名空间using StackExchange.Redis来导入StackExchange.Redis库。然后可以使用StackExchange.Redis提供的相关类和方法来连接Redis服务器,执行命令等操作。 需要注意的是,使用StackExchange.Redis之前需要正确配置和启动Redis服务器,并在代码中配置好相应的连接参数,以便连接到正确的Redis服务器和端口。 总结:使用StackExchange.Redis需要引用StackExchange.Redis.dll、StackExchange.Redis.Extensions.Core.dll和Newtonsoft.Json.dll三个DLL文件,可以通过NuGet来安装和添加这些DLL文件到项目中。在项目中使用StackExchange.Redis提供的类和方法来连接Redis服务器并执行相应的命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值