程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 緩存技術Redis在C#中的使用及Redis的封裝,

緩存技術Redis在C#中的使用及Redis的封裝,

編輯:C#入門知識

緩存技術Redis在C#中的使用及Redis的封裝,


Redis是一款開源的、高性能的鍵-值存儲(key-value store)。它常被稱作是一款數據結構服務器(data structure server)。Redis的鍵值可以包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等數據類型。 對於這些數據類型,你可以執行原子操作。例如:對字符串進行附加操作(append);遞增哈希中的值;向列表中增加元素;計算集合的交集、並集與差集 等。

    為了獲得優異的性能,Redis采用了內存中(in-memory)數據集(dataset)的方式。根據使用場景的不同,你可以每隔一段時間將數據集轉存到磁盤上來持久化數據,或者在日志尾部追加每一條操作命令。

    Redis同樣支持主從復制(master-slave replication),並且具有非常快速的非阻塞首次同步(non-blocking first synchronization)、網絡斷開自動重連等功能。同時Redis還具有其它一些特性,其中包括簡單的check-and-set機制、 pub/sub和配置設置等,以便使得Redis能夠表現得更像緩存(cache)。

    Redis還提供了豐富的客戶端,以便支持現階段流行的大多數編程語言。詳細的支持列表可以參看Redis官方文檔:http://redis.io /clients。Redis自身使用ANSI C來編寫,並且能夠在不產生外部依賴(external dependencies)的情況下運行在大多數POSIX系統上,例如:Linux、*BSD、OS X和Solaris等。

Redis 由四個可執行文件:redis-benchmark、redis-cli、redis-server、redis-stat 這四個文件,加上一個redis.conf就構成了整個redis的最終可用包。它們的作用如下:

    redis-server:Redis服務器的daemon啟動程序
    redis-cli:Redis命令行操作工具。當然,你也可以用telnet根據其純文本協議來操作
    redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
    redis-stat:Redis狀態檢測工具,可以檢測Redis當前狀態參數及延遲狀況

現在就可以啟動redis了,redis只有一個啟動參數,就是他的配置文件路徑。


首選,你先得開啟redis-server,否則無法連接服務:


打開redis-server:



接下來你就可以調用Redis的屬性來進行數據的存儲及獲取:



關鍵性代碼:

 

[csharp] view plain copy print?
  1. <span >using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using ServiceStack.Redis;  
  6. using ServiceStack.Redis.Support;  
  7.   
  8. namespace RedisStudy  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             try  
  15.             {  
  16.                 //獲取Redis操作接口  
  17.                 IRedisClient Redis = RedisManager.GetClient();  
  18.                 //Hash表操作  
  19.                 HashOperator operators = new HashOperator();  
  20.   
  21.                 //移除某個緩存數據  
  22.                 bool isTrue = Redis.Remove("additemtolist");  
  23.   
  24.                 //將字符串列表添加到redis  
  25.                 List<string> storeMembers = new List<string>() { "韓梅梅", "李雷", "露西" };  
  26.                 storeMembers.ForEach(x => Redis.AddItemToList("additemtolist", x));  
  27.                 //得到指定的key所對應的value集合  
  28.                 Console.WriteLine("得到指定的key所對應的value集合:");  
  29.                 var members = Redis.GetAllItemsFromList("additemtolist");  
  30.                 members.ForEach(s => Console.WriteLine("additemtolist :" + s));  
  31.                 Console.WriteLine("");  
  32.   
  33.                 // 獲取指定索引位置數據  
  34.                 Console.WriteLine("獲取指定索引位置數據:");  
  35.                 var item = Redis.GetItemFromList("additemtolist", 2);  
  36.                 Console.WriteLine(item);  
  37.   
  38.                 Console.WriteLine("");  
  39.   
  40.                 //將數據存入Hash表中  
  41.                 Console.WriteLine("Hash表數據存儲:");  
  42.                 UserInfo userInfos = new UserInfo() { UserName = "李雷", Age = 45 };  
  43.                 var ser = new ObjectSerializer();    //位於namespace ServiceStack.Redis.Support;  
  44.                 bool results = operators.Set<byte[]>("userInfosHash", "userInfos", ser.Serialize(userInfos));  
  45.                 byte[] infos = operators.Get<byte[]>("userInfosHash", "userInfos");  
  46.                 userInfos = ser.Deserialize(infos) as UserInfo;  
  47.                 Console.WriteLine("name=" + userInfos.UserName + "   age=" + userInfos.Age);  
  48.   
  49.                 Console.WriteLine("");  
  50.   
  51.                 //object序列化方式存儲  
  52.                 Console.WriteLine("object序列化方式存儲:");  
  53.                 UserInfo uInfo = new UserInfo() { UserName = "張三", Age = 12 };  
  54.                 bool result = Redis.Set<byte[]>("uInfo", ser.Serialize(uInfo));  
  55.                 UserInfo userinfo2 = ser.Deserialize(Redis.Get<byte[]>("uInfo")) as UserInfo;  
  56.                 Console.WriteLine("name=" + userinfo2.UserName + "   age=" + userinfo2.Age);  
  57.   
  58.                 Console.WriteLine("");  
  59.   
  60.                 //存儲值類型數據  
  61.                 Console.WriteLine("存儲值類型數據:");  
  62.                 Redis.Set<int>("my_age", 12);//或Redis.Set("my_age", 12);  
  63.                 int age = Redis.Get<int>("my_age");  
  64.                 Console.WriteLine("age=" + age);  
  65.   
  66.                 Console.WriteLine("");  
  67.   
  68.                 //序列化列表數據  
  69.                 Console.WriteLine("列表數據:");  
  70.                 List<UserInfo> userinfoList = new List<UserInfo> {  
  71.                 new UserInfo{UserName="露西",Age=1,Id=1},  
  72.                 new UserInfo{UserName="瑪麗",Age=3,Id=2},  
  73.             };  
  74.                 Redis.Set<byte[]>("userinfolist_serialize", ser.Serialize(userinfoList));  
  75.                 List<UserInfo> userList = ser.Deserialize(Redis.Get<byte[]>("userinfolist_serialize")) as List<UserInfo>;  
  76.                 userList.ForEach(i =>  
  77.                 {  
  78.                     Console.WriteLine("name=" + i.UserName + "   age=" + i.Age);  
  79.                 });  
  80.                 //釋放內存  
  81.                 Redis.Dispose();  
  82.                 operators.Dispose();  
  83.                 Console.ReadKey();  
  84.             }  
  85.             catch (Exception ex)  
  86.             {  
  87.                 Console.WriteLine(ex.Message.ToString());  
  88.                 Console.WriteLine("Please open the redis-server.exe ");  
  89.                 Console.ReadKey();  
  90.             }  
  91.         }  
  92.     }  
  93. }</span>  


RedisManager類:

 

[csharp] view plain copy print?
  1. <span >using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using ServiceStack.Redis;  
  6.   
  7. namespace RedisStudy  
  8. {  
  9.     /// <summary>  
  10.     /// RedisManager類主要是創建鏈接池管理對象的  
  11.     /// </summary>  
  12.     public class RedisManager  
  13.     {  
  14.         /// <summary>  
  15.         /// redis配置文件信息  
  16.         /// </summary>  
  17.         private static string RedisPath = System.Configuration.ConfigurationSettings.AppSettings["RedisPath"];  
  18.         private static PooledRedisClientManager _prcm;  
  19.   
  20.         /// <summary>  
  21.         /// 靜態構造方法,初始化鏈接池管理對象  
  22.         /// </summary>  
  23.         static RedisManager()  
  24.         {  
  25.             CreateManager();  
  26.         }  
  27.   
  28.         /// <summary>  
  29.         /// 創建鏈接池管理對象  
  30.         /// </summary>  
  31.         private static void CreateManager()  
  32.         {  
  33.             _prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath });  
  34.         }  
  35.   
  36.           
  37.         private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)  
  38.         {  
  39.             //WriteServerList:可寫的Redis鏈接地址。  
  40.             //ReadServerList:可讀的Redis鏈接地址。  
  41.             //MaxWritePoolSize:最大寫鏈接數。  
  42.             //MaxReadPoolSize:最大讀鏈接數。  
  43.             //AutoStart:自動重啟。  
  44.             //LocalCacheTime:本地緩存到期時間,單位:秒。  
  45.             //RecordeLog:是否記錄日志,該設置僅用於排查redis運行時出現的問題,如redis工作正常,請關閉該項。  
  46.             //RedisConfigInfo類是記錄redis連接信息,此信息和配置文件中的RedisConfig相呼應  
  47.   
  48.             // 支持讀寫分離,均衡負載   
  49.             return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig  
  50.             {  
  51.                 MaxWritePoolSize = 5, // “寫”鏈接池鏈接數   
  52.                 MaxReadPoolSize = 5, // “讀”鏈接池鏈接數   
  53.                 AutoStart = true,  
  54.             });  
  55.         }  
  56.   
  57.         private static IEnumerable<string> SplitString(string strSource, string split)  
  58.         {  
  59.             return strSource.Split(split.ToArray());  
  60.         }  
  61.   
  62.         /// <summary>  
  63.         /// 客戶端緩存操作對象  
  64.         /// </summary>  
  65.         public static IRedisClient GetClient()  
  66.         {  
  67.             if (_prcm == null)  
  68.             {  
  69.                 CreateManager();  
  70.             }  
  71.             return _prcm.GetClient();  
  72.         }  
  73.   
  74.     }  
  75. }</span>  


RedisOperatorBase類:

 

[csharp] view plain copy print?
  1. <span >using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using ServiceStack.Redis;  
  6.   
  7. namespace RedisStudy  
  8. {  
  9.     /// <summary>  
  10.     /// RedisOperatorBase類,是redis操作的基類,繼承自IDisposable接口,主要用於釋放內存  
  11.     /// </summary>  
  12.     public abstract class RedisOperatorBase : IDisposable  
  13.     {  
  14.         protected IRedisClient Redis { get; private set; }  
  15.         private bool _disposed = false;  
  16.         protected RedisOperatorBase()  
  17.         {  
  18.             Redis = RedisManager.GetClient();  
  19.         }  
  20.         protected virtual void Dispose(bool disposing)  
  21.         {  
  22.             if (!this._disposed)  
  23.             {  
  24.                 if (disposing)  
  25.                 {  
  26.                     Redis.Dispose();  
  27.                     Redis = null;  
  28.                 }  
  29.             }  
  30.             this._disposed = true;  
  31.         }  
  32.         public void Dispose()  
  33.         {  
  34.             Dispose(true);  
  35.             GC.SuppressFinalize(this);  
  36.         }  
  37.         /// <summary>  
  38.         /// 保存數據DB文件到硬盤  
  39.         /// </summary>  
  40.         public void Save()  
  41.         {  
  42.             Redis.Save();  
  43.         }  
  44.         /// <summary>  
  45.         /// 異步保存數據DB文件到硬盤  
  46.         /// </summary>  
  47.         public void SaveAsync()  
  48.         {  
  49.             Redis.SaveAsync();  
  50.         }  
  51.     }  
  52. }</span>  


HashOperator類:

 

[csharp] view plain copy print?
  1. <span >using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using ServiceStack.Text;  
  6.   
  7. namespace RedisStudy  
  8. {  
  9.     /// <summary>  
  10.     /// HashOperator類,是操作哈希表類。繼承自RedisOperatorBase類  
  11.     /// </summary>  
  12.     public class HashOperator : RedisOperatorBase  
  13.     {  
  14.         public HashOperator() : base() { }  
  15.         /// <summary>  
  16.         /// 判斷某個數據是否已經被緩存  
  17.         /// </summary>  
  18.         public bool Exist<T>(string hashId, string key)  
  19.         {  
  20.             return Redis.HashContainsEntry(hashId, key);  
  21.         }  
  22.         /// <summary>  
  23.         /// 存儲數據到hash表  
  24.         /// </summary>  
  25.         public bool Set<T>(string hashId, string key, T t)  
  26.         {  
  27.             var value = JsonSerializer.SerializeToString<T>(t);  
  28.             return Redis.SetEntryInHash(hashId, key, value);  
  29.         }  
  30.         /// <summary>  
  31.         /// 移除hash中的某值  
  32.         /// </summary>  
  33.         public bool Remove(string hashId, string key)  
  34.         {  
  35.             return Redis.RemoveEntryFromHash(hashId, key);  
  36.         }  
  37.         /// <summary>  
  38.         /// 移除整個hash  
  39.         /// </summary>  
  40.         public bool Remove(string key)  
  41.         {  
  42.             return Redis.Remove(key);  
  43.         }  
  44.         /// <summary>  
  45.         /// 從hash表獲取數據  
  46.         /// </summary>  
  47.         public T Get<T>(string hashId, string key)  
  48.         {  
  49.             string value = Redis.GetValueFromHash(hashId, key);  
  50.             return JsonSerializer.DeserializeFromString<T>(value);  
  51.         }  
  52.         /// <summary>  
  53.         /// 獲取整個hash的數據  
  54.         /// </summary>  
  55.         public List<T> GetAll<T>(string hashId)  
  56.         {  
  57.             var result = new List<T>();  
  58.             var list = Redis.GetHashValues(hashId);  
  59.             if (list != null && list.Count > 0)  
  60.             {  
  61.                 list.ForEach(x =>  
  62.                 {  
  63.                     var value = JsonSerializer.DeserializeFromString<T>(x);  
  64.                     result.Add(value);  
  65.                 });  
  66.             }  
  67.             return result;  
  68.         }  
  69.         /// <summary>  
  70.         /// 設置緩存過期  
  71.         /// </summary>  
  72.         public void SetExpire(string key, DateTime datetime)  
  73.         {  
  74.             Redis.ExpireEntryAt(key, datetime);  
  75.         }  
  76.     }  
  77. }</span>  


UserInfo類:

 

[csharp] view plain copy print?
  1. <span >using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace RedisStudy  
  7. {  
  8.     [Serializable]  
  9.     public class UserInfo  
  10.     {  
  11.         public int Id;  
  12.         public string UserName;  
  13.         public int Age;  
  14.     }  
  15. }</span>  


app.config配置:

[csharp] view plain copy print?
  1. <?xml version="1.0"?>  
  2. <configuration>  
  3. <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>  
  4.   <appSettings>  
  5.     <add key="RedisPath" value="127.0.0.1:6379"/>  
  6.   </appSettings>  
  7. </configuration>  






以上是Redis操作的封裝類,直接拿來調用即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved