Redis總結(二)C#中如何使用redis

  上一篇講述了安裝redis《Redis總結(一)Redis安裝》,同時也大體介紹了redis的優點和應用場景。本篇着重講解.NET中如何使用redis和C#。html

 

  Redis官網提供了不少開源的C#客戶端。例如,Nhiredis ,ServiceStack.Redis ,StackExchange.Redis等。其中ServiceStack.Redis應該算是比較流行的。它提供了一整套從Redis數據結構都強類型對象轉換的機制並將對象json序列化。因此這裏只介紹ServiceStack.Redis,它也是目前咱們產品中所使用的客戶端。 git

 

  ServiceStack.Redis地址https://github.com/ServiceStack/ServiceStack.Redis github

 

  1. 創建一個控制檯應用程序,並引用如下ServiceStack.Redis相關的四個類庫。或者經過Nuget進行安裝Redis經常使用組件ServiceStack.Redis。 下載示例代碼redis

      

 

  2. 建立一個Redis操做的公用類RedisCacheHelper,json

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.RedisTest
{
    public class RedisCacheHelper
    {
        private static readonly PooledRedisClientManager pool = null;
        private static readonly string[] redisHosts = 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 redisHostStr = ConfigurationManager.AppSettings["redis_server_session"];

            if (!string.IsNullOrEmpty(redisHostStr))
            {
                redisHosts = redisHostStr.Split(',');

                if (redisHosts.Length > 0)
                {
                    pool = new PooledRedisClientManager(redisHosts, redisHosts,
                        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;
        }
    }
}

  說明:RedisCacheHelper 使用的是客戶端連接池模式,這樣的存取效率應該是最高的。同時也更方便的支持讀寫分離,均衡負載。緩存

 

  3. 配置文件session

    <!-- redis Start   -->
    <add key="SessionExpireMinutes" value="180" />
    <add key="redis_server_session" value="127.0.0.1:6379" />
    <add key="redis_max_read_pool" value="3" />
    <add key="redis_max_write_pool" value="1" />
    <!--redis end-->

 

  4. 測試程序調用數據結構

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Redis寫入緩存:zhong");

            RedisCacheHelper.Add("zhong", "zhongzhongzhong", DateTime.Now.AddDays(1));

            Console.WriteLine("Redis獲取緩存:zhong");

            string str3 = RedisCacheHelper.Get<string>("zhong");

            Console.WriteLine(str3);

            Console.WriteLine("Redis獲取緩存:nihao");
            string str = RedisCacheHelper.Get<string>("nihao");
            Console.WriteLine(str);


            Console.WriteLine("Redis獲取緩存:wei");
            string str1 = RedisCacheHelper.Get<string>("wei");
            Console.WriteLine(str1);

            Console.ReadKey();
        }
    }

  

  5. 輸出結果測試

     

相關文章
相關標籤/搜索