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

关键性代码:

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");//将字符串列表添加到redisList<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类:

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类:

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类:

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类:

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配置:

<?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>

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

具体代码下载:

Redis code

转至 http://blog.csdn.net/wanlong360599336/article/details/46771477

Redis在C#中的使用及Redis的封装相关推荐

  1. 你了解Redis集群中的秘密吗?

    ​前言 今天早上北京地铁,看见一个正在学习Redis的小姐姐,很优秀 在之前的Redis系列文章中,介绍了Redis的持久化.主从复制以及哨兵机制,主从复制+哨兵机制,既可以解决主master和从sl ...

  2. 一文彻底理解Redis序列化协议,你也可以编写Redis客户端

    前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析 ...

  3. 【laravel7.x中文文档】Redis

    Redis 简介 Redis 是一个开源的,高级键值对存储数据库.由于它包含 字符串,哈希,列表,集合,和 有序集合 这些数据类型,所以它通常被称为数据结构服务器. 在将 Redis 与 Larave ...

  4. Redis系列2- C#中使用Redis的示例

    上一篇Redis的系列已经讲了Redis的下载.安装,接下来这一篇,主要讲使用Redis提供的 ServiceStack.Redis 这个开发库在C#项目中作为缓存服务使用的一个简单示例,废话不多话, ...

  5. redis在php中的使用介绍

    redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...

  6. redis在PHP中的基本使用案例

    服务端安装 Redis的官方下载站是http://redis.io/download,可以去上面下载最新的安装程序下来,我写此文章时的的稳定版本是2.6.11. 步骤一: 下载Redis 进入软件安装 ...

  7. Redis在APP中的应用

    前言 redis 是内存型数据库,读取data速度远快于mysql和sqlserver,如果将APP中列表信息或者一些常被访问的信息转存至内存上,然后APP通过redis读取内存上的数据,那么APP的 ...

  8. redis集群环境安装(参照redis中文官网,中间遇到了一些问题,so,记录一下)

    创建步骤 01. 准备环境 # yum install gcc # yum install ruby # yum install ruby-devel.x86_64 # yum install rub ...

  9. redis 实际应用中的缓存作用

    redis 实际应用中的缓存作用 有人说互联网用户是用脚投票的,这句话其实也从侧面说明了,用户体验是多么的重要:这就要求在软件架构设计时,不但要注重可靠性.安全性.可扩展性以及可维护性等等的一些指标, ...

最新文章

  1. 我的新浪微博,顺便总结下近况
  2. 马斯克躺枪得州最严堕胎法案,因拒绝表态遭炮轰!“不站女权就抵制特斯拉”...
  3. FTL页面常用到的一些方法combobox、combotree、datagrid
  4. 第五章 ORacle用户管理(1)
  5. matlab把图片转为base64
  6. rsync+lsyncd实现(本地以及远程)文件实时同步
  7. 找到最大回文子串_使用O(1)空间复杂度找到最大的回文子串
  8. Android Studio中获取SHA1或MD5的方法
  9. mysql时间字段不走索引_MySQL使用=或=范围查询时不走索引
  10. 声明 static 变量注意事项
  11. mybatis查询返回null解决方案
  12. 怎样使用OUTLOOK收发邮件   小雨
  13. rbac 一个用户对应多个账号_SaaS产品用户权限管理-RBAC
  14. linux用户打开进程数,Linux 用户打开进程数的调整
  15. Maven中的dependencyManagement 详解
  16. php性格属于哪类,狗狗性格分为6大类,你家是属哪一类?快来是看聪明型还是粘人型...
  17. css3动画animation属性大全
  18. 浏览器输入baidu.com之后跳转到baidu.com/?tn=92363592_hao_pg在跳转回百度解决方案
  19. 只使用一个块级元素绘制各种图形
  20. 任务调度之Elastic-Job

热门文章

  1. 微软针对中国中小企业推出打包服务
  2. 爬楼梯[LeetCode]
  3. POJ 1704 Georgia and Bob (Nim游戏变形)
  4. 设计模式总结——代理模式以及java的动态代理
  5. java如何监听以太坊交易
  6. StartSSL申请全过程 让网站拥有免费SSL证书
  7. Wdatepicker日期控件的使用指南
  8. Mac 上 iterm2 和 VSCode 终端中的字体设置建议
  9. linux内存源码分析 - 内存压缩(同步关系)
  10. shell特殊符号cut命令,sort_wc_uniq命令,tee_tr_split命令