netcore 集成redis集群

289 阅读2分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

netcore 集成redis集群

netcore集成redis

services.AddStackExchangeRedisCache(options =>
                {
                    options.Configuration = connectionString;
                    options.InstanceName = instanceName;
                });

1、集成redis集群

//单主机模式
//"Host": "XXXXXXX:6379,password=XXXXX,connectTimeout=3000,connectRetry=3,DefaultDatabase=0 ",
//集群模式  

"Host": "XXXXXXX:6379,XXXXXXX:6379,XXXXXXX:6379,serviceName=mymaster,password=XXXXXXX,connectTimeout=3000,connectRetry=3,KeepAlive=180,DefaultDatabase=0,$CLIENT=,$CLUSTER=,$CONFIG=,$ECHO=,$INFO=,$PING=",

\

2、使用哨兵模式集成redis集群   

//哨兵模式   

 "Host": "XXXXXXX:26379,XXXXXXX:26379,XXXXXXX:26379,serviceName=mymaster,password=XXXXXXX,connectTimeout=3000,connectRetry=3,KeepAlive=180,DefaultDatabase=0,allowAdmin = true"
完整的配置: "Redis": {
    //单主机模式
    //"Host": "XXXXXXX:6379,password=XXXXXXX,connectTimeout=3000,connectRetry=3,DefaultDatabase=0 ",
    //集群模式
    //"Host": "XXXXXXX:6379,XXXXXXX:6379,XXXXXXX:6379,serviceName=mymaster,password=XXXXXXX,connectTimeout=3000,connectRetry=3,KeepAlive=180,DefaultDatabase=0,$CLIENT=,$CLUSTER=,$CONFIG=,$ECHO=,$INFO=,$PING=",
    //哨兵模式
    "Host": "XXXXXXX:26379,XXXXXXX:26379,XXXXXXX:26379,serviceName=mymaster,password=XXXXXXX,connectTimeout=3000,connectRetry=3,KeepAlive=180,DefaultDatabase=0,allowAdmin = true"
  },

如何使用?

using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Service.Common.Autofac.Attributes;
using Service.Common.helpers;
using Service.Common.utils;
using Utils.Common.utils;

namespace Service.Common.Services
{
    /// <summary>
    /// 
    /// </summary>
    [Service(lifetime = ServiceLifetime.Singleton)]
    public class RedisService
    {
        private readonly IDistributedCache cache;


        public RedisService(IDistributedCache distributedCache)
        {
            cache = distributedCache;
        }



        ///// <summary>
        ///// 这里的 MergeKey 用来拼接 Key 的前缀,具体不同的业务模块使用不同的前缀。
        ///// </summary>
        ///// <param name="key"></param>
        ///// <returns></returns>
        //private string MergeKey(string key)
        //{
        //    if (String.IsNullOrEmpty(key))
        //    {
        //        return "";
        //    }
        //    return prefix + "_" + key;
        //    //return BaseSystemInfo.SystemCode + key;
        //}

        /// <summary>
        /// 根据key获取缓存对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T Get<T>(string key)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return default(T);
            }
            String result = Get(key);
            if (String.IsNullOrEmpty(result))
            {
                return default(T);
            }

            return DeserializeObject<T>(result);


        }

        /// <summary>
        /// 根据key获取缓存对象
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public String Get(string key)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return "";
            }
            //key = MergeKey(key);
            string result = "";
            if (!string.IsNullOrEmpty(key))
            {
                byte[] bytes = cache.Get(key);
                if (bytes != null && bytes.Length > 0)
                {
                    result = Encoding.UTF8.GetString(bytes);
                }
            }
            return result;
        }


        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expireMinutes"></param>
        public bool Set(string key, object value, int expireMinutes = 1440)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return false;
            }
            //String mergeKey = MergeKey(key);
            if (value == null)
            {
                return false;
            }

            expireMinutes = expireMinutes < 1 ? 1440 : expireMinutes;

            DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
            //设置绝对过期时间 两种写法
            options.AbsoluteExpiration = DateTime.Now.AddMinutes(expireMinutes);
            // options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(30));
            //设置滑动过期时间 两种写法
            //options.SlidingExpiration = TimeSpan.FromSeconds(30);
            //options.SetSlidingExpiration(TimeSpan.FromSeconds(30));
            //添加缓存
            cache.Set(key, SerializeToByte(value), options);
            //刷新缓存
            cache.Refresh(key);
            return true;
        }

        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="timeSpan"></param>
        public bool Set(string key, object value, TimeSpan timeSpan)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return false;
            }
            //String mergeKey = MergeKey(key);
            if (value == null)
            {
                return false;
            }
            DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
            //设置绝对过期时间 两种写法
            // options.AbsoluteExpiration = DateTime.Now.AddMinutes(expireMinutes);
            // options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(30));
            //设置滑动过期时间 两种写法
            options.SlidingExpiration = timeSpan;
            //options.SetSlidingExpiration(TimeSpan.FromSeconds(30));
            //添加缓存
            cache.Set(key, SerializeToByte(value), options);
            //刷新缓存
            cache.Refresh(key);

            return true;
        }


        /// <summary>
        /// 判断在缓存中是否存在该key的缓存数据
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Exists(string key)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return false;
            }
            //key = MergeKey(key);
            bool returnBool = true;
            byte[] val = cache.Get(key);
            if (val == null || val.Length == 0)
            {
                returnBool = false;
            }
            return returnBool;
        }

        /// <summary>
        /// 移除指定key的缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Remove(string key)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return true;
            }
            //key = MergeKey(key);
            bool returnBool = false;
            cache.Remove(key);
            if (Exists(key) == false)
            {
                returnBool = true;
            }
            return returnBool;
        }

        /// <summary>
        /// 异步设置
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        public async Task SetAsync(string key, object value)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return;
            }
            //key = MergeKey(key);
            await cache.SetAsync(key, SerializeToByte(value));
        }

        /// <summary>
        /// 根据key获取缓存对象
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public async Task<object> GetAsync(string key)
        {
            if (String.IsNullOrWhiteSpace(key))
            {
                return Task.FromResult<Object>(null);
            }
            //key = MergeKey(key);
            string returnString = null;
            var value = await cache.GetAsync(key);
            if (value != null)
            {
                returnString = Encoding.UTF8.GetString(value);
            }
            return returnString;
        }



        /// <summary>
        /// 反序列化对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        private T DeserializeObject<T>(String value)
        {

            if (value == null)
            {
                return default(T);
            }

            Type type = typeof(T);
            if (CommonUtils.IsPrimitive(type) || type.IsPrimitive)
            {
                return (T)CommonUtils.ConvertSimpleType(value, type);
            }
            else
            {
                return (T)JsonConvert.DeserializeObject(value, type);
            }

        }

        private byte[] SerializeToByte(Object value)
        {
            string serializeObject = SerializeObject(value);
            if (!String.IsNullOrEmpty(serializeObject))
            {
                return Encoding.UTF8.GetBytes(serializeObject);
            }

            return null;
        }

        private String SerializeObject(Object value)
        {
            if (value == null)
            {
                return "";
            }

            Type type = value.GetType();
            if (CommonUtils.IsPrimitive(type) || type.IsPrimitive)
            {
                return value.ToString();
            }
            else
            {
                return JsonConvert.SerializeObject(value);
            }

        }





    }
}