那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问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. [bzoj1878][SDOI2009]HH的项链_莫队

    HH 的项链 bzoj-1878 SDOI-2009 题目大意:给定一个n个数的序列.m次询问,每次询问一段区间内数的种类数. 注释:$1\le n\le 5\cdot 10^4$,$1\le m\l ...

  2. Ubuntu中PPA源是什么

    以下内容转自https://imcn.me/ppa: PPA是Personal Package Archives首字母简写.翻译为中文意思是:个人软件包文档 只有Ubuntu用户可以用,而所有的PPA ...

  3. Open Flash Chart图表的JSON格式基本属性详解

    http://blog.csdn.net/wangwenhui11/article/details/4283571 数据文件必须是JSON格式.JSON对象的基本格式: {} 把所有对象都编写在{}里 ...

  4. 如何基于udp实现tcp协议栈

    http://bbs.csdn.net/topics/280046868 使用套接字完成,按照tcp的方式在一个套接字里维持一个状态机. //定义枚举: enmu state{ CLOSED,//没有 ...

  5. 转:SQL 索引最左前缀原理

    表结构和索引列 假设数据库中表是这样的:  我们只考虑一张表employees.titles: 索引是(emp_no,title,from_date) SHOW INDEX FROM employee ...

  6. POJ 2485 Highways 最小生成树 (Kruskal)

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...

  7. Ubuntu 查看当前目录使用的总空间大小

    查看当前目录使用的总空间大小 du -h --max-depth=0 #du -h --max-depth=0 217M . 查看当前目录使用总空间的大小以及当前目录下一级文件及文件夹各自使用的总空间 ...

  8. 【Codeforces】Round #375 (Div. 2)

    Position:http://codeforces.com/contest/723 我的情况 啊哈哈,这次raiting肯定要涨,接受过上次的教训,先用小号送肉,大号都是一发切,重回蓝咯 结果... ...

  9. bzoj3545

    线段树合并+离线+启发式合并 半年前这道题t成狗... 离线的做法比较好想,按照边的权值排序,询问的权值排序,然后枚举询问不断加边,加到上限后查找第k大值,这里平衡树,权值线段树都可以实现. 那么我们 ...

  10. Linux文件属性相关补充及软硬连接

    第1章 文件属性相关 1.1 文件的属性 1.1.1 扩展名 windows  通过扩展名区分不同的类型的文件 linux 扩展名是给人类看的 方便我们区分不同类型文件 .conf      配置文件 ...