redis发布订阅

1、RedisManager

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RedisLibrary
{
    public class RedisManager
    {
        static int i = 0;
        static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(()=> {
            i++;
            return ConnectionMultiplexer.Connect(_conn);
        });
        public static ConnectionMultiplexer LazyConnection
        {
            get
            {
                return lazyConnection.Value;
            }
        }
        static ConnectionMultiplexer _redis = null;
        static readonly object _locker = new object();
        private static readonly string _conn = "127.0.0.1:6379";
        public static ConnectionMultiplexer Manager
        {
            get
            {
                if (_redis == null)
                {
                    lock (_locker)
                    {
                        if (_redis != null)
                        {
                            return _redis;
                        }else
                        {
                            return GetManager();
                        }
                    }
                }
                return _redis;
            }
        }
        private static ConnectionMultiplexer GetManager(string connectionString=null)
        {
            return ConnectionMultiplexer.Connect(_conn);
        }
    }
}

2、RedisHelper

using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RedisLibrary
{
    /// <summary>
    /// Redis操作类
    /// </summary>
    public class RedisHelper
    {
        public static async void PubAsync(string channel,string message)
        {
            await RedisManager.Manager.GetDatabase().PublishAsync(channel,message);
        }
        public static void Pub(string channel, string message)
        {
            RedisManager.Manager.GetDatabase().Publish(channel, message);
        }
        public static void Sub(string channel, Action<string> action)
        {
            var sub=RedisManager.Manager.GetSubscriber();
            sub.Subscribe(channel,(redisChannel,redisValue)=> {
                action(redisValue);
            });
        }

        #region string类型
        /// <summary>
        /// 根据Key获取值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string StringGet(string key)
        {
            try
            {
                using (var client = RedisManager.Manager)
                {
                    return client.GetDatabase().StringGet(key);
                }
            }catch(Exception ex)
            {
                return null;
            }
        }
        /// <summary>
        /// 批量获取值
        /// </summary>
        /// <param name="keyStrs"></param>
        /// <returns></returns>
        public static string[] StringGetMany(string[] keyStrs)
        {
            var count = keyStrs.Length;
            var keys = new RedisKey[count];
            var addrs = new string[count];
            for(var i = 0; i < count; i++)
            {
                keys[i] = keyStrs[i];
            }
            try
            {
                using (var client = RedisManager.Manager)
                {
                    var values = client.GetDatabase().StringGet(keys);
                    for(var i = 0; i < values.Length; i++)
                    {
                        addrs[i] = values[i];
                    }
                    return addrs;
                }
            }catch(Exception ex)
            {
                return null;
            }
        }
        /// <summary>
        /// 单条存值
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool StringSet(string key,string value)
        {
            using(var client = RedisManager.Manager)
            {
                return client.GetDatabase().StringSet(key,value);
            }
        }
        /// <summary>
        /// 批量存值
        /// </summary>
        /// <param name="keysStr"></param>
        /// <param name="valuesStr"></param>
        /// <returns></returns>
        public static bool StringSetMany(string[] keysStr,string[] valuesStr)
        {
            var count = keysStr.Length;
            var keyValuePair = new KeyValuePair<RedisKey, RedisValue>[count];
            for(int i = 0; i < count; i++)
            {
                keyValuePair[i] = new KeyValuePair<RedisKey, RedisValue>(keysStr[i],valuesStr[i]);
            }
            using (var client = RedisManager.Manager)
            {
                return client.GetDatabase().StringSet(keyValuePair);
            }
        }
        #endregion
        #region 泛型
        /// <summary>
        /// 存值并设置过期时间
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="t"></param>
        /// <param name="ts">过期时间间隔</param>
        /// <returns></returns>
        public static bool Set<T>(string key,T t,TimeSpan ts)
        {
            var str = JsonConvert.SerializeObject(t);
            using (var client = RedisManager.Manager)
            {
                return client.GetDatabase().StringSet(key,str,ts);
            }
        }
        /// <summary>
        /// 根据Key获取值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public static T Get<T>(string key) where T : class
        {
            using (var client = RedisManager.Manager)
            {
                var strValue = client.GetDatabase().StringGet(key);
                return string.IsNullOrWhiteSpace(strValue) ? null : JsonConvert.DeserializeObject<T>(strValue);
            }
        }
        #endregion
    }
}

3、发布

RedisHelper.Pub("pub11", "pub2");

4、订阅

class Program
    {
        static void Main(string[] args)
        {
            RedisHelper.Sub("pub11",(message)=> {
                Console.WriteLine(message);
            });
         }
}

 

posted @ 2018-06-25 15:46  wjl910  阅读(110)  评论(0)    收藏  举报