那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问Redis。

这里我们使用的库为:

StackExchange.Redis

GitHub:https://github.com/StackExchange/StackExchange.Redis

NuGet:PM> Install-Package StackExchange.Redis

Newtonsoft.Json(Json.NET)

GitHub:https://github.com/JamesNK/Newtonsoft.Json

NuGet:PM> Install-Package Newtonsoft.Json

如果你项目中有Newtonsoft.Json可以不用安装

一.Redis配置类(RedisConfig.cs),用于配置Redis的参数

 using System.Configuration;

 namespace RedisDemo.Common
{
public static class RedisConfig
{
private static string _Password = string.Empty;
/// <summary>
/// 密码
/// </summary>
public static string Password
{
get
{
if (string.IsNullOrEmpty(_Password))
{
_Password = GetAppWebConfig("RedisPassword");
}
return _Password;
}
} private static string _IP = string.Empty;
/// <summary>
/// IP地址
/// </summary>
public static string IP
{
get
{
if (string.IsNullOrEmpty(_IP))
{
_IP = GetAppWebConfig("RedisIP");
}
return _IP;
}
} private static int _Port = ;
/// <summary>
/// 端口号
/// </summary>
public static int Port
{
get
{
if (_Port == )
{
_Port = ParseInt(GetAppWebConfig("RedisPort"), );
}
return _Port;
}
} private static int _Timeout = ;
/// <summary>
/// 链接超时时间
/// </summary>
public static int Timeout
{
get
{
if (_Timeout == )
{
_Timeout = ParseInt(GetAppWebConfig("RedisTimeout"), );
}
return _Timeout;
}
} private static int _Retry = ;
/// <summary>
/// 重试次数
/// </summary>
public static int Retry
{
get
{
if (_Retry == )
{
_Retry = ParseInt(GetAppWebConfig("RedisRetry"), );
}
return _Retry;
}
} private static int _DefaultDB = -;
/// <summary>
/// 默认使用的数据库(0 - 15)
/// </summary>
public static int DefaultDB
{
get
{
if (_DefaultDB == -)
{
_DefaultDB = ParseInt(GetAppWebConfig("RedisDefaultDB"), );
}
return _DefaultDB;
}
} /// <summary>
/// 根据键名获取web.config/appsettings的值
/// </summary>
/// <param name="key">键</param>
/// <returns></returns>
public static string GetAppWebConfig(string key)
{
string text = ConfigurationManager.AppSettings[key];
return (text != null) ? text : string.Empty;
} /// <summary>
/// Int类型转换
/// </summary>
/// <param name="o">需要被转换的值</param>
/// <param name="defaultVal">转换失败后的默认值</param>
/// <returns></returns>
public static int ParseInt(object o, int defaultVal)
{
int result;
if (o == null)
{
result = defaultVal;
}
else
{
string s = o.ToString();
int num;
if (!int.TryParse(s, out num))
{
num = defaultVal;
}
result = num;
}
return result;
}
}
}

二.Redis连接管理类(RedisManager.cs)

 using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.IO;
using System.Text;
using System.Web; namespace RedisDemo.Common
{
public class RedisManager
{
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
var configurationOptions = new ConfigurationOptions()
{
Password = RedisConfig.Password,
EndPoints = { { RedisConfig.IP, RedisConfig.Port } },
DefaultDatabase = RedisConfig.DefaultDB,
ConnectTimeout = RedisConfig.Timeout,
ConnectRetry = RedisConfig.Retry,
AbortOnConnectFail = false
};
return ConnectionMultiplexer.Connect(configurationOptions);
}); public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
} /// <summary>
/// Redis连接失败事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
{
var faildObj = new
{
EndPoint = e.EndPoint.ToString(),
FailureType = e.FailureType.ToString(),
Message = e.Exception == null ? "" : e.Exception.Message
};
string logText = string.Format(LOG_ERROR_TEMPLATE, DateTime.Now, "Redis连接失败", JsonConvert.SerializeObject(faildObj));
WriteRedisErrorLog(logText);
} private static void WriteRedisErrorLog(string Content)
{
DateTime logDate = DateTime.Now;
string logPath = "~/Log/RedisError/";
string logFilePath = GetMapPath(logPath + logDate.ToString("yyyy") + "/" + logDate.ToString("MM") + "/" + logDate.ToString("yyyyMMdd") + ".log");
WriteFile(logFilePath, Content, true);
} private const string LOG_ERROR_TEMPLATE = "**************** {0} ****************\r\n"
+ "类型:{1}\r\n\r\n"
+ "消息:{2}\r\n\r\n\r\n\r\n\r\n\r\n"; private static void WriteFile(string file, string fileContent, bool Append)
{
FileInfo fileInfo = new FileInfo(file);
if (!Directory.Exists(fileInfo.DirectoryName))
{
Directory.CreateDirectory(fileInfo.DirectoryName);
}
StreamWriter streamWriter = new StreamWriter(file, Append, Encoding.UTF8);
try
{
streamWriter.Write(fileContent);
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
finally
{
streamWriter.Flush();
streamWriter.Close();
}
} public static string GetMapPath(string strPath)
{
string result;
if (HttpContext.Current != null)
{
result = HttpContext.Current.Server.MapPath(strPath);
}
else
{
result = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath.TrimStart('~', '/'));
}
return result;
}
}
}

三.Redis操作类(RedisBase.cs)

 using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic; namespace RedisDemo.Common
{
public class RedisBase
{
IDatabase db; public RedisBase()
{
db = RedisManager.Connection.GetDatabase();
} /// <summary>
/// 构造函数,用于操作其他db
/// </summary>
/// <param name="dbNumber"></param>
public RedisBase(int dbNumber)
{
db = RedisManager.Connection.GetDatabase(dbNumber);
} /// <summary>
/// 设置String类型Redis缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">String字符串</param>
/// <param name="expiry">过期时间</param>
/// <returns></returns>
public bool SetString(string key, string value, TimeSpan? expiry = default(TimeSpan?))
{
return db.StringSet(key, value, expiry);
} /// <summary>
/// 获取String类型Redis缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string GetString(string key)
{
return db.StringGet(key);
} /// <summary>
/// 设置单个对象Redis缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="expiry"></param>
/// <returns></returns>
public bool SetObject<T>(string key, T value, TimeSpan? expiry = default(TimeSpan?)) where T : class
{
return SetString(key, JsonConvert.SerializeObject(value), expiry);
} /// <summary>
/// 获取单个对象Redis缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetObject<T>(string key) where T : class
{
string value = GetString(key);
if (string.IsNullOrEmpty(value))
{
return null;
}
return JsonConvert.DeserializeObject<T>(value);
} /// <summary>
/// 插入List集合对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
public bool SetList<T>(string key, List<T> value, TimeSpan? expiry = default(TimeSpan?))
{
return SetString(key, JsonConvert.SerializeObject(value), expiry);
} /// <summary>
/// 获取List集合对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public List<T> GetList<T>(string key)
{
return JsonConvert.DeserializeObject<List<T>>(GetString(key));
} /// <summary>
/// 删除单个Key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(string key)
{
return db.KeyDelete(key);
} /// <summary>
/// 删除多个key
/// </summary>
/// <param name="keys"></param>
public long RemoveAll(RedisKey[] keys)
{
return db.KeyDelete(keys);
} /// <summary>
/// 判断key是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool ContainsKey(string key)
{
return db.KeyExists(key);
} /// <summary>
/// 重新命名key
/// </summary>
/// <param name="key"></param>
/// <param name="newKey"></param>
/// <returns></returns>
public bool KeyRename(string key, string newKey)
{
if (!this.ContainsKey(key))
{
return false;
}
return db.KeyRename(key, newKey);
} /// <summary>
/// 追加值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void AppendString(string key, string value)
{
//追加值,返回追加后长度
long appendlong = db.StringAppend(key, value);
} public bool IsConnected(RedisKey key)
{
return db.IsConnected(key, CommandFlags.None);
}
}
}

作者:黄昌
出处:http://www.cnblogs.com/h-change/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

5.C#编写Redis访问类的更多相关文章

  1. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  2. C#-ade.net-实体类、数据访问类

    实体类.数据访问类 是由封装演变而来,使对数据的访问更便捷,使用时只需要调用即可,无需再次编写代码 实体类是按照数据库表的结构封装起来的一个类 首先,新建文件夹 App_Code ,用于存放数据库类等 ...

  3. ADO.NET(完整修改和查询、实体类,数据访问类)

    一.完整修改和查询 在编写c#语句时需考虑到用户体验,例如在编写修改语句时,需要考虑到输入的内容在数据库中是否能够找到. 中间变量运用. 1.先查 2.执行操作 完整修改语句: bool has = ...

  4. ADO.NET(一) 空间 ADO.NET结构 命名空间(车延禄) System.Data—— 所有的一般数据访问类 S(转载)

    ADO.NET(一) 空间   ADO.NET结构 命名空间(车延禄)System.Data—— 所有的一般数据访问类System.Data.Common—— 各个数据提供程序共享(或重写)的类Sys ...

  5. redis 工具类 单个redis、JedisPool 及多个redis、shardedJedisPool与spring的集成配置

    http://www.cnblogs.com/edisonfeng/p/3571870.html http://javacrazyer.iteye.com/blog/1840161 http://ww ...

  6. redis访问安全加固

    目录 redis漏洞 入侵特征 安全隐患 redis安全规范 禁止root用户启动 限制redis文件目录访问权限 开启密码认证,设置复杂密码 禁用或重命名危险命令 设置允许监听地址,不要使用0.0. ...

  7. 利用Xml架构生成实体访问类

    由xml生成xsd及实体类   xmldataset工具 使用VS2005工具XSD.exe(SDK/v2.0/Bin/xsd.exe)自动生成实体类: xsd /c /namespace:myCom ...

  8. php 基于redis计数器类

    本文引自网络 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本文将使用其incr(自增),get(获取), ...

  9. 使用kendynet构建异步redis访问服务

    使用kendynet构建异步redis访问服务 最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用stri ...

随机推荐

  1. JAVA NIO 之Channel

    缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.Channel 通道就是将数据传输给 ByteBuffer 对象或者从 ByteBuffer 对象获取数据进行传输. Channel 用于在 ...

  2. SVM学习(续)核函数 & 松弛变量和惩罚因子

    SVM的文章可以看:http://www.cnblogs.com/charlesblc/p/6193867.html 有写的最好的文章来自:http://www.blogjava.net/zhenan ...

  3. Ubuntu上面安装Redis Python

    Ubuntu上面安装Redis Python 1,下载redis源码https://redis.io/download,下载地址:http://124.205.69.169/files/A092000 ...

  4. 基于FPGA的简易数字时钟

    基于FPGA的可显示数字时钟,设计思路为自底向上,包含三个子模块:时钟模块,进制转换模块.led显示模块.所用到的FPGA晶振频率为50Mhz,首先利用它得到1hz的时钟然后然后得到时钟模块.把时钟模 ...

  5. HDU 3008 DP

    基础DP题 打BOSS  BOSS和自己都有100点血.玩家先手 每回合能够选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力 ...

  6. 第K顺序统计量的求解

    一个n个元素组成的集合中,第K个顺序统计量(Order Statistic)指的是该集合中第K小的元素,我们要讨论的是如何在线性时间(linear time)里找出一个数组的第K个顺序统计量. 一.问 ...

  7. 在SAE搭建Python+Django+MySQL(基于Windows)

    为了与时俱进,工作闲余開始研究Python,刚一接触就被Python这"优雅"的语法吸引住.后来接触到了Django.尽管还没有太深入的研究.但对这样的新概念的WEB开发非常感兴趣 ...

  8. DM8168 dead JTAG clock

    针对新板调试,不针对EVM板. TI XDS560连上DM8168 20pin仿真接口 launch 8168.ccxml,右击CortexA8,选择Connect Target 出现错误例如以下: ...

  9. 解析java中volatilekeyword

    在java多线程编程中常常volatile,有时候这个keyword和synchronized 或者lock常常有人混淆.详细解析例如以下: 在多线程的环境中会存在成员变量可见性问题: java的每一 ...

  10. Java遍历一个文件夹下的全部文件

    Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其它流类不同的是,流类关心的是文件的内容.而File类关心的是磁盘上文件的存储. 一,File类有多个构造器,经常 ...