那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问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. HDU——4738 Caocao's Bridges

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. Eclipse代码/目录虚线对齐设置

    前提: 我的Eclipse版本如下: 比这个版本新或者旧都可以实现如下效果. 实现步骤: 在代码上显示虚线设置有如下方法: 1.如果不使用插件,Eclipse是不支持虚线的,只能是横条的点状,效果如下 ...

  3. I/O虚拟化

    note:这里主要记录我对IO虚拟化的理解,希望这篇文章对想了解虚拟化IO的同学有点帮助.这是我在看论文[vale,a switched ethernet for virtual machines]的 ...

  4. 【打CF,学算法——二星级】Codeforces Round #312 (Div. 2) A Lala Land and Apple Trees

    [CF简单介绍] 提交链接:A. Lala Land and Apple Trees 题面: A. Lala Land and Apple Trees time limit per test 1 se ...

  5. Andriod实现刮刮卡的效果

    思想: 将一个View设计成多层,内层(包含中奖信息)和外层(用于刮奖),外层的图层用Canvas与一个Bitmap关联,用这个关联的Bitmap来处理手势的滑动.类似于刮奖的动作. 使用paint. ...

  6. LeetCode 349. Intersection of Two Arrays (两个数组的相交)

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...

  7. 发现所有的字都被加上了 <font> 标签,导致样式全部错乱

    经检查,发现我的浏览器默认打开了翻译软件!!!!!!!

  8. 尊重百度的api语音合成规则

    屏幕显示字幕内容与形式 和  字幕的播放时长分离 : 去除标点符号的影响 # 设置分句的标志符号:可以根据实际需要进行修改 # cutlist = ".!?".decode('ut ...

  9. vim g 和 % 区别

    vim中的g(global)和%的区别: g:全局的 s/pattern/replacement/  : 替换行中出现的每一个pattern g/pattern/s/pattern/replaceme ...

  10. SQL SERVER 语句大全

    ·SQL的简单查询实例教程关键词:SQL语句大全 中文网 整理编辑,经典SQL语句大全(SQL语句大总结),欢迎网友投稿 下列语句部分是Mssql语句,不可以在access中使用.SQL分类:DDL— ...