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的属性来进行数据的存储及获取:

关键性代码:

  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. namespace RedisStudy
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. try
  14. {
  15. //获取Redis操作接口
  16. IRedisClient Redis = RedisManager.GetClient();
  17. //Hash表操作
  18. HashOperator operators = new HashOperator();
  19. //移除某个缓存数据
  20. bool isTrue = Redis.Remove("additemtolist");
  21. //将字符串列表添加到redis
  22. List<string> storeMembers = new List<string>() { "韩梅梅", "李雷", "露西" };
  23. storeMembers.ForEach(x => Redis.AddItemToList("additemtolist", x));
  24. //得到指定的key所对应的value集合
  25. Console.WriteLine("得到指定的key所对应的value集合:");
  26. var members = Redis.GetAllItemsFromList("additemtolist");
  27. members.ForEach(s => Console.WriteLine("additemtolist :" + s));
  28. Console.WriteLine("");
  29. // 获取指定索引位置数据
  30. Console.WriteLine("获取指定索引位置数据:");
  31. var item = Redis.GetItemFromList("additemtolist", 2);
  32. Console.WriteLine(item);
  33. Console.WriteLine("");
  34. //将数据存入Hash表中
  35. Console.WriteLine("Hash表数据存储:");
  36. UserInfo userInfos = new UserInfo() { UserName = "李雷", Age = 45 };
  37. var ser = new ObjectSerializer();    //位于namespace ServiceStack.Redis.Support;
  38. bool results = operators.Set<byte[]>("userInfosHash", "userInfos", ser.Serialize(userInfos));
  39. byte[] infos = operators.Get<byte[]>("userInfosHash", "userInfos");
  40. userInfos = ser.Deserialize(infos) as UserInfo;
  41. Console.WriteLine("name=" + userInfos.UserName + "   age=" + userInfos.Age);
  42. Console.WriteLine("");
  43. //object序列化方式存储
  44. Console.WriteLine("object序列化方式存储:");
  45. UserInfo uInfo = new UserInfo() { UserName = "张三", Age = 12 };
  46. bool result = Redis.Set<byte[]>("uInfo", ser.Serialize(uInfo));
  47. UserInfo userinfo2 = ser.Deserialize(Redis.Get<byte[]>("uInfo")) as UserInfo;
  48. Console.WriteLine("name=" + userinfo2.UserName + "   age=" + userinfo2.Age);
  49. Console.WriteLine("");
  50. //存储值类型数据
  51. Console.WriteLine("存储值类型数据:");
  52. Redis.Set<int>("my_age", 12);//或Redis.Set("my_age", 12);
  53. int age = Redis.Get<int>("my_age");
  54. Console.WriteLine("age=" + age);
  55. Console.WriteLine("");
  56. //序列化列表数据
  57. Console.WriteLine("列表数据:");
  58. List<UserInfo> userinfoList = new List<UserInfo> {
  59. new UserInfo{UserName="露西",Age=1,Id=1},
  60. new UserInfo{UserName="玛丽",Age=3,Id=2},
  61. };
  62. Redis.Set<byte[]>("userinfolist_serialize", ser.Serialize(userinfoList));
  63. List<UserInfo> userList = ser.Deserialize(Redis.Get<byte[]>("userinfolist_serialize")) as List<UserInfo>;
  64. userList.ForEach(i =>
  65. {
  66. Console.WriteLine("name=" + i.UserName + "   age=" + i.Age);
  67. });
  68. //释放内存
  69. Redis.Dispose();
  70. operators.Dispose();
  71. Console.ReadKey();
  72. }
  73. catch (Exception ex)
  74. {
  75. Console.WriteLine(ex.Message.ToString());
  76. Console.WriteLine("Please open the redis-server.exe ");
  77. Console.ReadKey();
  78. }
  79. }
  80. }
  81. }</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. namespace RedisStudy
  7. {
  8. /// <summary>
  9. /// RedisManager类主要是创建链接池管理对象的
  10. /// </summary>
  11. public class RedisManager
  12. {
  13. /// <summary>
  14. /// redis配置文件信息
  15. /// </summary>
  16. private static string RedisPath = System.Configuration.ConfigurationSettings.AppSettings["RedisPath"];
  17. private static PooledRedisClientManager _prcm;
  18. /// <summary>
  19. /// 静态构造方法,初始化链接池管理对象
  20. /// </summary>
  21. static RedisManager()
  22. {
  23. CreateManager();
  24. }
  25. /// <summary>
  26. /// 创建链接池管理对象
  27. /// </summary>
  28. private static void CreateManager()
  29. {
  30. _prcm = CreateManager(new string[] { RedisPath }, new string[] { RedisPath });
  31. }
  32. private static PooledRedisClientManager CreateManager(string[] readWriteHosts, string[] readOnlyHosts)
  33. {
  34. //WriteServerList:可写的Redis链接地址。
  35. //ReadServerList:可读的Redis链接地址。
  36. //MaxWritePoolSize:最大写链接数。
  37. //MaxReadPoolSize:最大读链接数。
  38. //AutoStart:自动重启。
  39. //LocalCacheTime:本地缓存到期时间,单位:秒。
  40. //RecordeLog:是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项。
  41. //RedisConfigInfo类是记录redis连接信息,此信息和配置文件中的RedisConfig相呼应
  42. // 支持读写分离,均衡负载
  43. return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
  44. {
  45. MaxWritePoolSize = 5, // “写”链接池链接数
  46. MaxReadPoolSize = 5, // “读”链接池链接数
  47. AutoStart = true,
  48. });
  49. }
  50. private static IEnumerable<string> SplitString(string strSource, string split)
  51. {
  52. return strSource.Split(split.ToArray());
  53. }
  54. /// <summary>
  55. /// 客户端缓存操作对象
  56. /// </summary>
  57. public static IRedisClient GetClient()
  58. {
  59. if (_prcm == null)
  60. {
  61. CreateManager();
  62. }
  63. return _prcm.GetClient();
  64. }
  65. }
  66. }</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. namespace RedisStudy
  7. {
  8. /// <summary>
  9. /// RedisOperatorBase类,是redis操作的基类,继承自IDisposable接口,主要用于释放内存
  10. /// </summary>
  11. public abstract class RedisOperatorBase : IDisposable
  12. {
  13. protected IRedisClient Redis { get; private set; }
  14. private bool _disposed = false;
  15. protected RedisOperatorBase()
  16. {
  17. Redis = RedisManager.GetClient();
  18. }
  19. protected virtual void Dispose(bool disposing)
  20. {
  21. if (!this._disposed)
  22. {
  23. if (disposing)
  24. {
  25. Redis.Dispose();
  26. Redis = null;
  27. }
  28. }
  29. this._disposed = true;
  30. }
  31. public void Dispose()
  32. {
  33. Dispose(true);
  34. GC.SuppressFinalize(this);
  35. }
  36. /// <summary>
  37. /// 保存数据DB文件到硬盘
  38. /// </summary>
  39. public void Save()
  40. {
  41. Redis.Save();
  42. }
  43. /// <summary>
  44. /// 异步保存数据DB文件到硬盘
  45. /// </summary>
  46. public void SaveAsync()
  47. {
  48. Redis.SaveAsync();
  49. }
  50. }
  51. }</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. namespace RedisStudy
  7. {
  8. /// <summary>
  9. /// HashOperator类,是操作哈希表类。继承自RedisOperatorBase类
  10. /// </summary>
  11. public class HashOperator : RedisOperatorBase
  12. {
  13. public HashOperator() : base() { }
  14. /// <summary>
  15. /// 判断某个数据是否已经被缓存
  16. /// </summary>
  17. public bool Exist<T>(string hashId, string key)
  18. {
  19. return Redis.HashContainsEntry(hashId, key);
  20. }
  21. /// <summary>
  22. /// 存储数据到hash表
  23. /// </summary>
  24. public bool Set<T>(string hashId, string key, T t)
  25. {
  26. var value = JsonSerializer.SerializeToString<T>(t);
  27. return Redis.SetEntryInHash(hashId, key, value);
  28. }
  29. /// <summary>
  30. /// 移除hash中的某值
  31. /// </summary>
  32. public bool Remove(string hashId, string key)
  33. {
  34. return Redis.RemoveEntryFromHash(hashId, key);
  35. }
  36. /// <summary>
  37. /// 移除整个hash
  38. /// </summary>
  39. public bool Remove(string key)
  40. {
  41. return Redis.Remove(key);
  42. }
  43. /// <summary>
  44. /// 从hash表获取数据
  45. /// </summary>
  46. public T Get<T>(string hashId, string key)
  47. {
  48. string value = Redis.GetValueFromHash(hashId, key);
  49. return JsonSerializer.DeserializeFromString<T>(value);
  50. }
  51. /// <summary>
  52. /// 获取整个hash的数据
  53. /// </summary>
  54. public List<T> GetAll<T>(string hashId)
  55. {
  56. var result = new List<T>();
  57. var list = Redis.GetHashValues(hashId);
  58. if (list != null && list.Count > 0)
  59. {
  60. list.ForEach(x =>
  61. {
  62. var value = JsonSerializer.DeserializeFromString<T>(x);
  63. result.Add(value);
  64. });
  65. }
  66. return result;
  67. }
  68. /// <summary>
  69. /// 设置缓存过期
  70. /// </summary>
  71. public void SetExpire(string key, DateTime datetime)
  72. {
  73. Redis.ExpireEntryAt(key, datetime);
  74. }
  75. }
  76. }</span>

UserInfo类:

  1. <span style="color:#000000;">using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace RedisStudy
  6. {
  7. [Serializable]
  8. public class UserInfo
  9. {
  10. public int Id;
  11. public string UserName;
  12. public int Age;
  13. }
  14. }</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. <add key="RedisPath" value="127.0.0.1:6379"/>
  6. </appSettings>
  7. </configuration>

以上是Redis操作的封装类,直接拿来调用即可。

缓存技术Redis在C#中的使用及Redis的封装的更多相关文章

  1. 【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过涉及架构部分的内容 你只需关心Cache即 ...

  2. 浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...

  3. Redis在C#中的使用及Redis的封装

    Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server).Redis的键值可以包括字符串(string ...

  4. Redis】Java中使用Jedis操作Redis(Maven导入包)、创建Redis连接池

    如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <!-- https: ...

  5. Redis - 1 - linux中使用docker-compose安装Redis - 更新完毕

    0.前言 有我联系方式的那些半吊子的人私信问我:安装Redis有没有更简单的方式,网上那些文章和视频,没找到满意的方法,所以我搞篇博客出来说明一下我的安装方式吧 1.准备工作 保证自己的linux中已 ...

  6. 高效PHP Redis缓存技术,可参考下步骤

    是否想过PHP使用redis作为缓存时,如何能: 前后台模块共用Model层: 但是,不能每个Model类都进行缓存,这样太浪费Redis资源: 前后台模块可以自由决定从数据库还是从缓存读数据: 没有 ...

  7. 图片_ _图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  8. 图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...

  9. 转 图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

随机推荐

  1. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

  2. .Net组件程序设计之远程调用(一)

    .Net组件程序设计之远程调用(一) 1应用程序域 我们知道我们写的C#代码是在操作系统逻辑体系结构中最上层的,然而操作系统本身是不会认识C#代码的,它只认识机器代码.那我们写的程序经过编译后是编译成 ...

  3. ArcGIS之Cartogram地图变形记

    一.地图会说谎 地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选.如图1是2012年美国总统大选后网上给出的一个结果图,红色代 ...

  4. Visual Studio Code + live-server编辑和浏览HTML网页

    第一步: 安装Visual Studio Code + Node.JS 第二步:通过如下命令行安装live-server npm install -g live-server 第三步:打开Visual ...

  5. enum操作--获取枚举里的最大值

    一个应用系统,如果程序里没有任何enum的使用,我认为它的可读性是有待商榷的. 求枚举里的最大/最小枚举值, 其实是对Array进行操作: enum EnumTest { ddd = , eee } ...

  6. Java基础-输入输出-3.编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc。

    3.编写BinIoDemo.java的Java应用程序,程序完成的功能是:完成1.doc文件的复制,复制以后的文件的名称为自己的学号姓名.doc. try { FileInputStream in = ...

  7. 实战Hybird app:内存溢出与优化

    pheongap项目:http://www.nduoa.com/apk/detail/646816 主要的问题: heap过大,内存低性能差的机子上引起奔溃,直接退出 关于web app的优化,不仅仅 ...

  8. 深入学习jQuery节点关系

    × 目录 [1]后代元素 [2]祖先元素 [3]兄弟元素 前面的话 DOM可以将任何HTML描绘成一个由多层节点构成的结构.节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形 ...

  9. Android数据存储之SharedPreferences及如何安全存储

    前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...

  10. 谈谈基于OAuth 2.0的第三方认证 [上篇]

    对于目前大部分Web应用来说,用户认证基本上都由应用自身来完成.具体来说,Web应用利用自身存储的用户凭证(基本上是用户名/密码)与用户提供的凭证进行比较进而确认其真实身份.但是这种由Web应用全权负 ...