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,否则无法连接服务:

net redis封装 c# redis 封装_List

 

打开redis-server:

net redis封装 c# redis 封装_net redis封装_02

 

 

接下来你就可以调用Redis的属性来进行数据的存储及获取:

net redis封装 c# redis 封装_net redis封装_03

 

 

关键性代码:

 

1. <span style="color:#000000;">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. new HashOperator();  
20.   
21. //移除某个缓存数据  
22. bool isTrue = Redis.Remove("additemtolist");  
23.   
24. //将字符串列表添加到redis  
25. string> storeMembers = new List<string>() { "韩梅梅", "李雷", "露西" };  
26. "additemtolist", x));  
27. //得到指定的key所对应的value集合  
28. "得到指定的key所对应的value集合:");  
29. "additemtolist");  
30. "additemtolist :" + s));  
31. "");  
32.   
33. // 获取指定索引位置数据  
34. "获取指定索引位置数据:");  
35. "additemtolist", 2);  
36.                 Console.WriteLine(item);  
37.   
38. "");  
39.   
40. //将数据存入Hash表中  
41. "Hash表数据存储:");  
42. new UserInfo() { UserName = "李雷", Age = 45 };  
43. 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. as UserInfo;  
47. "name=" + userInfos.UserName + "   age=" + userInfos.Age);  
48.   
49. "");  
50.   
51. //object序列化方式存储  
52. "object序列化方式存储:");  
53. new UserInfo() { UserName = "张三", Age = 12 };  
54. bool result = Redis.Set<byte[]>("uInfo", ser.Serialize(uInfo));  
55. byte[]>("uInfo")) as UserInfo;  
56. "name=" + userinfo2.UserName + "   age=" + userinfo2.Age);  
57.   
58. "");  
59.   
60. //存储值类型数据  
61. "存储值类型数据:");  
62. int>("my_age", 12);//或Redis.Set("my_age", 12);  
63. int age = Redis.Get<int>("my_age");  
64. "age=" + age);  
65.   
66. "");  
67.   
68. //序列化列表数据  
69. "列表数据:");  
70. new List<UserInfo> {  
71. new UserInfo{UserName="露西",Age=1,Id=1},  
72. new UserInfo{UserName="玛丽",Age=3,Id=2},  
73.             };  
74. byte[]>("userinfolist_serialize", ser.Serialize(userinfoList));  
75. byte[]>("userinfolist_serialize")) as List<UserInfo>;  
76.                 userList.ForEach(i =>  
77.                 {  
78. "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. "Please open the redis-server.exe ");  
89.                 Console.ReadKey();  
90.             }  
91.         }  
92.     }  
93. }</span>
<span style="color:#000000;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack.Redis;
using ServiceStack.Redis.Support;

namespace RedisStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //获取Redis操作接口
                IRedisClient Redis = RedisManager.GetClient();
                //Hash表操作
                HashOperator operators = new HashOperator();

                //移除某个缓存数据
                bool isTrue = Redis.Remove("additemtolist");

                //将字符串列表添加到redis
                List<string> storeMembers = new List<string>() { "韩梅梅", "李雷", "露西" };
                storeMembers.ForEach(x => Redis.AddItemToList("additemtolist", x));
                //得到指定的key所对应的value集合
                Console.WriteLine("得到指定的key所对应的value集合:");
                var members = Redis.GetAllItemsFromList("additemtolist");
                members.ForEach(s => Console.WriteLine("additemtolist :" + s));
                Console.WriteLine("");

                // 获取指定索引位置数据
                Console.WriteLine("获取指定索引位置数据:");
                var item = Redis.GetItemFromList("additemtolist", 2);
                Console.WriteLine(item);

                Console.WriteLine("");

                //将数据存入Hash表中
                Console.WriteLine("Hash表数据存储:");
                UserInfo userInfos = new UserInfo() { UserName = "李雷", Age = 45 };
                var ser = new ObjectSerializer();    //位于namespace ServiceStack.Redis.Support;
                bool results = operators.Set<byte[]>("userInfosHash", "userInfos", ser.Serialize(userInfos));
                byte[] infos = operators.Get<byte[]>("userInfosHash", "userInfos");
                userInfos = ser.Deserialize(infos) as UserInfo;
                Console.WriteLine("name=" + userInfos.UserName + "   age=" + userInfos.Age);

                Console.WriteLine("");

                //object序列化方式存储
                Console.WriteLine("object序列化方式存储:");
                UserInfo uInfo = new UserInfo() { UserName = "张三", Age = 12 };
                bool result = Redis.Set<byte[]>("uInfo", ser.Serialize(uInfo));
                UserInfo userinfo2 = ser.Deserialize(Redis.Get<byte[]>("uInfo")) as UserInfo;
                Console.WriteLine("name=" + userinfo2.UserName + "   age=" + userinfo2.Age);

                Console.WriteLine("");

                //存储值类型数据
                Console.WriteLine("存储值类型数据:");
                Redis.Set<int>("my_age", 12);//或Redis.Set("my_age", 12);
                int age = Redis.Get<int>("my_age");
                Console.WriteLine("age=" + age);

                Console.WriteLine("");

                //序列化列表数据
                Console.WriteLine("列表数据:");
                List<UserInfo> userinfoList = new List<UserInfo> {
                new UserInfo{UserName="露西",Age=1,Id=1},
                new UserInfo{UserName="玛丽",Age=3,Id=2},
            };
                Redis.Set<byte[]>("userinfolist_serialize", ser.Serialize(userinfoList));
                List<UserInfo> userList = ser.Deserialize(Redis.Get<byte[]>("userinfolist_serialize")) as List<UserInfo>;
                userList.ForEach(i =>
                {
                    Console.WriteLine("name=" + i.UserName + "   age=" + i.Age);
                });
                //释放内存
                Redis.Dispose();
                operators.Dispose();
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
                Console.WriteLine("Please open the redis-server.exe ");
                Console.ReadKey();
            }
        }
    }
}</span>

RedisManager类:

 

 


1. <span style="color:#000000;">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. 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. // “写”链接池链接数   
52. // “读”链接池链接数   
53. 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>
<span style="color:#000000;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack.Redis;

namespace RedisStudy
{
    /// <summary>
    /// RedisManager类主要是创建链接池管理对象的
    /// </summary>
    public class RedisManager
    {
        /// <summary>
        /// redis配置文件信息
        /// </summary>
        private static string RedisPath = System.Configuration.ConfigurationSettings.AppSettings["RedisPath"];
        private static PooledRedisClientManager _prcm;

        /// <summary>
        /// 静态构造方法,初始化链接池管理对象
        /// </summary>
        static RedisManager()
        {
            CreateManager();
        }

        /// <summary>
        /// 创建链接池管理对象
        /// </summary>
        private static void CreateManager()
        {
            _prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath });
        }

        
        private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
        {
            //WriteServerList:可写的Redis链接地址。
            //ReadServerList:可读的Redis链接地址。
            //MaxWritePoolSize:最大写链接数。
            //MaxReadPoolSize:最大读链接数。
            //AutoStart:自动重启。
            //LocalCacheTime:本地缓存到期时间,单位:秒。
            //RecordeLog:是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项。
            //RedisConfigInfo类是记录redis连接信息,此信息和配置文件中的RedisConfig相呼应

            // 支持读写分离,均衡负载 
            return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
            {
                MaxWritePoolSize = 5, // “写”链接池链接数 
                MaxReadPoolSize = 5, // “读”链接池链接数 
                AutoStart = true,
            });
        }

        private static IEnumerable<string> SplitString(string strSource, string split)
        {
            return strSource.Split(split.ToArray());
        }

        /// <summary>
        /// 客户端缓存操作对象
        /// </summary>
        public static IRedisClient GetClient()
        {
            if (_prcm == null)
            {
                CreateManager();
            }
            return _prcm.GetClient();
        }

    }
}</span>

RedisOperatorBase类:

 


1. <span style="color:#000000;">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. null;  
28.                 }  
29.             }  
30. this._disposed = true;  
31.         }  
32. public void Dispose()  
33.         {  
34. true);  
35. 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>
<span style="color:#000000;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack.Redis;

namespace RedisStudy
{
    /// <summary>
    /// RedisOperatorBase类,是redis操作的基类,继承自IDisposable接口,主要用于释放内存
    /// </summary>
    public abstract class RedisOperatorBase : IDisposable
    {
        protected IRedisClient Redis { get; private set; }
        private bool _disposed = false;
        protected RedisOperatorBase()
        {
            Redis = RedisManager.GetClient();
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                    Redis.Dispose();
                    Redis = null;
                }
            }
            this._disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        /// <summary>
        /// 保存数据DB文件到硬盘
        /// </summary>
        public void Save()
        {
            Redis.Save();
        }
        /// <summary>
        /// 异步保存数据DB文件到硬盘
        /// </summary>
        public void SaveAsync()
        {
            Redis.SaveAsync();
        }
    }
}</span>

HashOperator类:

 


1. <span style="color:#000000;">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. 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>
<span style="color:#000000;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceStack.Text;

namespace RedisStudy
{
    /// <summary>
    /// HashOperator类,是操作哈希表类。继承自RedisOperatorBase类
    /// </summary>
    public class HashOperator : RedisOperatorBase
    {
        public HashOperator() : base() { }
        /// <summary>
        /// 判断某个数据是否已经被缓存
        /// </summary>
        public bool Exist<T>(string hashId, string key)
        {
            return Redis.HashContainsEntry(hashId, key);
        }
        /// <summary>
        /// 存储数据到hash表
        /// </summary>
        public bool Set<T>(string hashId, string key, T t)
        {
            var value = JsonSerializer.SerializeToString<T>(t);
            return Redis.SetEntryInHash(hashId, key, value);
        }
        /// <summary>
        /// 移除hash中的某值
        /// </summary>
        public bool Remove(string hashId, string key)
        {
            return Redis.RemoveEntryFromHash(hashId, key);
        }
        /// <summary>
        /// 移除整个hash
        /// </summary>
        public bool Remove(string key)
        {
            return Redis.Remove(key);
        }
        /// <summary>
        /// 从hash表获取数据
        /// </summary>
        public T Get<T>(string hashId, string key)
        {
            string value = Redis.GetValueFromHash(hashId, key);
            return JsonSerializer.DeserializeFromString<T>(value);
        }
        /// <summary>
        /// 获取整个hash的数据
        /// </summary>
        public List<T> GetAll<T>(string hashId)
        {
            var result = new List<T>();
            var list = Redis.GetHashValues(hashId);
            if (list != null && list.Count > 0)
            {
                list.ForEach(x =>
                {
                    var value = JsonSerializer.DeserializeFromString<T>(x);
                    result.Add(value);
                });
            }
            return result;
        }
        /// <summary>
        /// 设置缓存过期
        /// </summary>
        public void SetExpire(string key, DateTime datetime)
        {
            Redis.ExpireEntryAt(key, datetime);
        }
    }
}</span>

UserInfo类:

 


1. <span style="color:#000000;">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>
<span style="color:#000000;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RedisStudy
{
    [Serializable]
    public class UserInfo
    {
        public int Id;
        public string UserName;
        public int Age;
    }
}</span>

 

app.config配置:

 


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