亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#redis使用之ServiceStack

2019-11-14 14:19:33
字體:
來源:轉載
供稿:網友

需要注意的是:ServiceStack.Redis 中GetClient()方法,只能拿到Master redis中獲取連接,而拿不到slave 的readonly連接。這樣 slave起到了冗余備份的作用,讀的功能沒有發揮出來,如果并發請求太多的話,則Redis的性能會有影響。

    所以,我們需要的寫入和讀取的時候做一個區分,寫入的時候,調用client.GetClient() 來獲取writeHosts的Master的redis 鏈接。讀取,則調用client.GetReadOnlyClient()來獲取的readonlyHost的 Slave的redis鏈接。

    或者可以直接使用client.GetCacheClient() 來獲取一個連接,他會在寫的時候調用GetClient獲取連接,讀的時候調用GetReadOnlyClient獲取連接,這樣可以做到讀寫分離,從而利用redis的主從復制功能。

    1. 配置文件 app.config

  <!-- redis Start   -->
    <add key="sessionExpireMinutes" value="180" />
    <add key="redis_server_master_session" value="127.0.0.1:6379" />
    <add key="redis_server_slave_session" value="127.0.0.1:6380" />
    <add key="redis_max_read_pool" value="300" />
    <add key="redis_max_write_pool" value="100" />
    <!--redis end-->

2. Redis操作的公用類RedisCacheHelper

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Web;
using ServiceStack.Common.Extensions;
using ServiceStack.Redis;
using ServiceStack.Logging;

namespace Weiz.Redis.Common
{
    public class RedisCacheHelper
    {
        PRivate static readonly PooledRedisClientManager pool = null;
        private static readonly string[] writeHosts = null;
        private static readonly string[] readHosts = null;
        public static int RedisMaxReadPool = int.Parse(ConfigurationManager.AppSettings["redis_max_read_pool"]);
        public static int RedisMaxWritePool = int.Parse(ConfigurationManager.AppSettings["redis_max_write_pool"]);
        static RedisCacheHelper()
        {
            var redisMasterHost = ConfigurationManager.AppSettings["redis_server_master_session"];
            var redisSlaveHost = ConfigurationManager.AppSettings["redis_server_slave_session"];

            if (!string.IsNullOrEmpty(redisMasterHost))
            {
                writeHosts = redisMasterHost.Split(',');
                readHosts = redisSlaveHost.Split(',');

                if (readHosts.Length > 0)
                {
                    pool = new PooledRedisClientManager(writeHosts, readHosts,
                        new RedisClientManagerConfig()
                        {
                            MaxWritePoolSize = RedisMaxWritePool,
                            MaxReadPoolSize = RedisMaxReadPool,
                           
                            AutoStart = true
                        });
                }
            }
        }
        public static void Add<T>(string key, T value, DateTime expiry)
        {
            if (value == null)
            {
                return;
            }

            if (expiry <= DateTime.Now)
            {
                Remove(key);

                return;
            }

            try
            {
                if (pool != null)
                {
                    using (var r = pool.GetClient())
                    {
                        if (r != null)
                        {
                            r.SendTimeout = 1000;
                            r.Set(key, value, expiry - DateTime.Now);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("{0}:{1}發生異常!{2}", "cache", "存儲", key);
            }

        }

        public static void Add<T>(string key, T value, TimeSpan slidingExpiration)
        {
            if (value == null)
            {
                return;
            }

            if (slidingExpiration.TotalSeconds <= 0)
            {
                Remove(key);

                return;
            }

            try
            {
                if (pool != null)
                {
                    using (var r = pool.GetClient())
                    {
                        if (r != null)
                        {
                            r.SendTimeout = 1000;
                            r.Set(key, value, slidingExpiration);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("{0}:{1}發生異常!{2}", "cache", "存儲", key);
            }

        }



        public static T Get<T>(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return default(T);
            }

            T obj = default(T);

            try
            {
                if (pool != null)
                {
                    using (var r = pool.GetClient())
                    {
                        if (r != null)
                        {
                            r.SendTimeout = 1000;
                            obj = r.Get<T>(key);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("{0}:{1}發生異常!{2}", "cache", "獲取", key);
            }


            return obj;
        }

        public static void Remove(string key)
        {
            try
            {
                if (pool != null)
                {
                    using (var r = pool.GetClient())
                    {
                        if (r != null)
                        {
                            r.SendTimeout = 1000;
                            r.Remove(key);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("{0}:{1}發生異常!{2}", "cache", "刪除", key);
            }

        }

        public static bool Exists(string key)
        {
            try
            {
                if (pool != null)
                {
                    using (var r = pool.GetClient())
                    {
                        if (r != null)
                        {
                            r.SendTimeout = 1000;
                            return r.ContainsKey(key);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = string.Format("{0}:{1}發生異常!{2}", "cache", "是否存在", key);
            }

            return false;
        }

        public static IDictionary<string, T> GetAll<T>(IEnumerable<string> keys) where T : class
        {
            if (keys == null)
            {
                return null;
            }

            keys = keys.Where(k => !string.IsNullOrWhiteSpace(k));

            if (keys.Count() == 1)
            {
                T obj = Get<T>(keys.Single());

                if (obj != null)
                {
                    return new Dictionary<string, T>() { { keys.Single(), obj } };
                }

                return null;
            }

            if (!keys.Any())
            {
                return null;
            }

            IDictionary<string, T> dict = null;

            if (pool != null)
            {
                keys.Select(s => new
                {
                    Index = Math.Abs(s.GetHashCode()) % readHosts.Length,
                    KeyName = s
                })
                .GroupBy(p => p.Index)
                .Select(g =>
                {
                    try
                    {
                        using (var r = pool.GetClient(g.Key))
                        {
                            if (r != null)
                            {
                                r.SendTimeout = 1000;
                                return r.GetAll<T>(g.Select(p => p.KeyName));
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        string msg = string.Format("{0}:{1}發生異常!{2}", "cache", "獲取", keys.Aggregate((a, b) => a + "," + b));
                    }
                    return null;
                })
                .Where(x => x != null)
                .ForEach(d =>
                {
                    d.ForEach(x =>
                    {
                        if (dict == null || !dict.Keys.Contains(x.Key))
                        {
                            if (dict == null)
                            {
                                dict = new Dictionary<string, T>();
                            }
                            dict.Add(x);
                        }
                    });
                });
            }

            IEnumerable<Tuple<string, T>> result = null;

            if (dict != null)
            {
                result = dict.Select(d => new Tuple<string, T>(d.Key, d.Value));
            }
            else
            {
                result = keys.Select(key => new Tuple<string, T>(key, Get<T>(key)));
            }

            return result
                .Select(d => new Tuple<string[], T>(d.Item1.Split('_'), d.Item2))
                .Where(d => d.Item1.Length >= 2)
                .ToDictionary(x => x.Item1[1], x => x.Item2);
        }
    }
}


上一篇:Redis使用總結

下一篇:asp.net柱形圖

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人免费小视频| 91夜夜揉人人捏人人添红杏| 伦伦影院午夜日韩欧美限制| 亚洲性生活视频在线观看| 亚洲精品www| 这里只有精品视频在线| 欧美大全免费观看电视剧大泉洋| 亚洲无av在线中文字幕| 久久天天躁狠狠躁夜夜躁2014| 亚洲精品按摩视频| 亚洲va欧美va在线观看| 日本亚洲欧洲色α| 欧美电影院免费观看| 日韩亚洲欧美中文高清在线| 久久精品中文字幕| 国产成人一区二区三区| 2018日韩中文字幕| 国产日韩精品一区二区| 国产日韩中文在线| 欧美人与物videos| 国产精品久久久久久久久久久久久久| 在线日韩中文字幕| 欧美激情精品久久久久久蜜臀| 高清日韩电视剧大全免费播放在线观看| 另类色图亚洲色图| 亚洲一区二区日本| 亚洲第一天堂av| 成人激情视频在线观看| 一本大道久久加勒比香蕉| 日本精品视频网站| 国产亚洲成av人片在线观看桃| 91地址最新发布| 欧美成人免费在线观看| 久久精品久久久久| 成人国产精品一区| 色综合视频一区中文字幕| 色综合久久88色综合天天看泰| 国产亚洲欧洲在线| 欧美区在线播放| 亚洲综合国产精品| 国产精品亚洲综合天堂夜夜| 久久的精品视频| 性色av一区二区三区红粉影视| 亚洲区免费影片| 成人久久18免费网站图片| 国产区精品在线观看| 国产亚洲欧美另类中文| 丝袜情趣国产精品| 日韩国产欧美精品一区二区三区| 欧美性xxxxxxxxx| 另类美女黄大片| 亚洲片国产一区一级在线观看| 亚洲成年人影院在线| 日本最新高清不卡中文字幕| 欧美性videos高清精品| 国产丝袜一区二区三区| 亚洲成色777777在线观看影院| 蜜臀久久99精品久久久无需会员| 97精品视频在线| 欧美一区亚洲一区| 91免费综合在线| 8090成年在线看片午夜| 国产女精品视频网站免费| www.色综合| 亚洲男人av电影| 午夜欧美不卡精品aaaaa| 51视频国产精品一区二区| 亚洲一区二区自拍| 欧美日韩成人黄色| 国产精品高清网站| 影音先锋日韩有码| 91久久精品国产91性色| 亚洲电影在线看| 欧美国产精品va在线观看| 色综合影院在线| 午夜精品久久久久久久99黑人| 国产精品午夜视频| 麻豆国产va免费精品高清在线| 在线观看精品自拍私拍| 96sao精品视频在线观看| 国产精品wwww| 亚洲精品福利免费在线观看| 国产精品亚洲网站| 国产视频精品va久久久久久| 亚洲精品电影久久久| 色噜噜亚洲精品中文字幕| 国产精品69久久久久| 国产69精品久久久久99| 亚洲乱亚洲乱妇无码| 国产精品扒开腿爽爽爽视频| 91国产中文字幕| 国产经典一区二区| 日av在线播放中文不卡| 国产不卡一区二区在线播放| 北条麻妃99精品青青久久| 欧美激情亚洲一区| 久久久综合免费视频| 国产精品高清免费在线观看| 日韩电影在线观看中文字幕| 尤物精品国产第一福利三区| 91牛牛免费视频| 爱福利视频一区| 精品久久久久久久久久| 91在线视频成人| 奇米成人av国产一区二区三区| 欧美激情网友自拍| 精品国产一区二区三区久久| 欧美黑人一区二区三区| 7m第一福利500精品视频| 亚洲jizzjizz日本少妇| 国产精品草莓在线免费观看| 高清欧美性猛交xxxx黑人猛交| 欧美激情国产高清| 国产精品久久久久久av福利软件| 欧美日韩国产成人高清视频| 日韩av电影在线播放| 亚洲性日韩精品一区二区| 亚洲欧洲国产精品| 日韩av日韩在线观看| 日本一区二三区好的精华液| 国语自产精品视频在免费| 欧美激情啊啊啊| 国产在线播放91| 欧美日韩一区二区免费视频| 日韩国产高清视频在线| 亚洲免费福利视频| 国产精品日日摸夜夜添夜夜av| 亚洲国产欧美日韩精品| 97香蕉久久超级碰碰高清版| 国产精品自拍视频| 久久精视频免费在线久久完整在线看| 黄色一区二区在线| 日韩欧美在线一区| 欧美亚洲视频在线看网址| 亚洲欧美一区二区三区情侣bbw| 亚洲成人免费网站| 欧美成人亚洲成人日韩成人| 这里只有精品在线播放| 日韩人体视频一二区| 国产精品视频网| 另类天堂视频在线观看| 欧美日韩电影在线观看| 午夜精品视频在线| 欧洲成人午夜免费大片| 久久91亚洲人成电影网站| 欧美激情免费观看| 亚洲精品视频二区| 粗暴蹂躏中文一区二区三区| 成人免费视频a| 中文字幕精品www乱入免费视频| 亚洲欧美日韩一区二区三区在线| 在线视频中文亚洲| 国语自产精品视频在线看抢先版图片| 欧美中文字幕视频| 国产精品美乳在线观看| 国产精品国模在线| 日韩欧美一区二区三区久久| 欧美天天综合色影久久精品| 欧美激情中文字幕乱码免费| 欧美野外猛男的大粗鳮| 国语自产偷拍精品视频偷| 久久久久久国产精品美女| 欧美在线视频观看免费网站| 国产精品久久久久久av福利软件|