redis在asp.net 中的应用
1.redis介绍
Nosql数据库作为关系型数据库的补充,在互联网公司已经得到广泛的运用。redis便是其中的代表之一,redis是一种(key,value)基于内存的数据库,并支持多种数据结构,如List,HashSet,string等,并能够支持的数据的持久化存储,redis如何做内存数据到磁盘的同步将分单独的章节讲解。既然redis是基于内存的数据库,那么它将应用在对性能要求高的场合,如做数据缓存,可以减少数据库访问的压力。同时redis可以应用在统计分析类的Web应用,统计分析类Web应用,一般情况下会从数据库中读取大量的数据并进行相关计算,因此,可以通过数据预处理的方式将数据提前计算,并以(key,value)的形式保存在redis中,从而能够极大的改善查询性能。
2.redis 在windows下的使用。
redis在linux下广泛使用。官方网站为:http://redis.io/,window下redis官方并不提供支持,但是可以在http://redis.io/download下载windows64版redis,是由microsoft open tech 组开发和维护,开源代码以发布在GitHub上:https://github.com/MSOpenTech/redis。另外在提供一个.exe可执行文件下载地址,支持32bit和64bit:https://github.com/rgl/redis/downloads。
下载redis.exe文件后,安装redis后,会在对应的Redis根目录中出现:redis-cli.exe,redis-server.exe,redis-service.exe,分别对应redis客户端,服务端和redis服务启动程序。打开分别redis-server.exe和redis-cli.exe后,在redis-cli命令行中输入相关命令向redis服务器发送读写命令,可以看到redis-server命令行中显示客户端的连接情况。如下图所示:
图1.redis-server运行图
图2.redis-cli运行图
接下来我们通过简单的c# console程序来读写redis server数据库。
3.c# 连接redis server数据库。
目前比较常用的redis client c#类库主要有:StackExchange.Redis和ServiceStack.Redis,本文主要使用的是StackExchange.Redis,StackExchange是一个高性能客户端类库,同时提供同步和异步操作。通过nuget来安装StackExchange后,可以通过其连接redis server。
StackExchange中提供了一个ConnectionMultiplexer类,该对象屏蔽了底层多Redis服务器连接的细节,该对象的连接建立被设计成可以被客户端多个调用者之间共享及复用。因此,不必在每次对redis操作时建立新的ConnectionMultiplexer对象。与此同时,该对象的操作被设计成线程安全的。为了建立到Redis server的连接,我们可以使用如下的方式:
ConnectionMultiplexer con = ConnectionMultiplexer.Connect("localhost:6379"),redis server默认端口为6379.
为了复用ConnectionMultiplexer对象,我们可以通过定义静态的属性,通过返回ConnectionMultiplexer的实例来使用该对象。接下来我们写个简单的单例模式来获取ConnectionMultiplexer对象。代码如下:
public class RedisConnection
{ private static readonly Lazy<ConnectionMultiplexer> _connection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect("localhost:6379")); public static ConnectionMultiplexer Connection { get { return _connection.Value; } }
}
通过堕式加载的方式来创建ConnectionMultiplexer实例,该实例的初始化的创建是线程安全的。
接下来我们通过定义个简单的client来测试对redis 服务器的读写操作。
class Program
{
static void Main(string[] args)
{
ConnectionMultiplexer con = RedisConnection.Connection;
IDatabase db = con.GetDatabase();//默认是连接到数据库0
db.StringSet("name", "tom");
string value = db.StringGet("name");
Console.WriteLine("name:"+value);
}
}
程序的执行结果为:name:tom.
接下来我们写一个简单的对象在redis中的存储。
首先我们定义一个Student类:
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string School { get; set; }
}
因为redis在存储对象前需要首先将对象进行序列化,读取对象时需要进行反序列话,接下来,我们将定义两个IDatabase的扩展方法。
public static class RedisExtension
{
public static TResult Get<TResult>(this IDatabase cache, string key)
{
return Deserialize<TResult>(cache.StringGet(key));
} public static void Set<TIn>(this IDatabase cache, string key, TIn value)
{
cache.StringSet(key, Serialize(value));
} static byte[] Serialize(object o)
{
if (o == null)
return null;
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream mStream = new MemoryStream())
{
binaryFormatter.Serialize(mStream,o);
byte[] objectDataAsStream = mStream.ToArray();
return objectDataAsStream;
}
} static TResult Deserialize<TResult>(byte[] stream)
{
if (stream == null)
return default(TResult);
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream memStream = new MemoryStream(stream))
{
TResult result = (TResult)formatter.Deserialize(memStream);
return result;
} } }
接下来我们在定义一个Client来测试redis对象的读写的使用:
class Program
{
static void Main(string[] args)
{
ConnectionMultiplexer con = RedisConnection.Connection; IDatabase db = con.GetDatabase();
Student st = new Student { Age = , Name = "tom", School = "mit" };
db.Set("student", st);
Console.WriteLine("name:" + st.Name + " Age:" + st.Age);
}
}
运行程序后,程序抛出异常,提示Student没有表示Serializable,在Student类上加上[Serializable]属性后,运行程序后,结果输出:name:tom Age:12。
接下来我们在写个简单的web api 的例子来演示redis作为缓存在web api中的使用,基本上与c# console中使用redis相同,除了在对象的返回上需要做些额外的处理。
在VS中新建一个web api项目后,我们简单的建一个StudentController。
在该例子中使用的类方法的调用与前面的例子是一样的。并且为了方便,我将所有的操作都写在了Controller中。
namespace MvcApplication3.Controllers
{
public class StudentController :ApiController
{
public Student Get(int id)
{
string cacheKey = "GetStudent:" + id; ConnectionMultiplexer con = RedisConnection.Connection;
IDatabase db = con.GetDatabase(1);
Student stObj = db.Get<Student>(cacheKey);
if (stObj != null)
{
return stObj; }
Student st = new Student { Id = 1, Age = 12, Name = "tom", School = "ustc" };
db.Set(cacheKey,st);
return st;
}
}
}
我们通过fiddler来查看服务器端返回的对象结果。在url框中输入:http://localhost:8536/api/Student/1,查看服务器端返回的JSON数据结果:
我们可以看到了返回的字段的信息,这其实并不是我们期望的信息,因为我们在定义Sudent类的时候使用的是自动的set get属性,在c#编译器编译成il代码时会生成对应属性的字段的信息,这些生成的字段名字就是上图对应的信息。默认情况下,web api会在对象返回前对对象字段及自动属性进行序列化,当我们为类表示[Serializable]属性时,只会序列化字段信息,为了序列化对应的属性,返回我们需要的信息我们需要定义如下的Student类:
[Serializable]
[DataContract]
public class Student
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string School { get; set; }
}
这时,我们在运行应用,输入url:http://localhost:8536/api/Student/1,返回的Json数据如下:
得到了我们需要的结果,当然,在web api中我们也可以通过如下的方式。是默认的json序列化器忽略[Serializable]属性:
通过在Global.aspx的App_start方法中进行如下设置:
var serializerSettings =
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
(DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;
至此,redis的在c#中的简单运用就介绍到这!


redis在asp.net 中的应用的更多相关文章
- 在Asp.Net中使用Redis【本文摘自智车芯官网】
Redis安装 在安装之前需要获取Redis安装包.在这里我们就不详细介绍安装包的获取了.这里Redis-x64-3.2.100.zip安装包为例通过dos命令取安装.通过dos命令找到安装目录. 在 ...
- 解决ASP.NET中Redis 每小时6000次访问请求的问题
原文:解决ASP.NET中Redis 每小时6000次访问请求的问题 虽然ServiceStack v4是商业支持的产品,但我们也允许免费使用小型项目和评估目的.上面的NuGet包中包含可以使用许可证 ...
- 在ASP.NET中如何运行后台任务
from:https://blogs.msdn.microsoft.com/scott_hanselman/2014/12/21/asp-net/ [原文发表地址] How to run Backgr ...
- 【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用
本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过涉及架构部分的内容 你只需关心Cache即 ...
- 浅谈缓存技术在ASP.NET中的运用
本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过, 你只需关心Cache即可,具体的架构, ...
- ServiceStack.Redis 的 ASP.NET Core 扩展库
给大家安利一款 ServiceStack.Redis 的 ASP.NET Core 扩展库,它是基于 ServiceStack.Redis.Core 开发的. 简单易用,开源免费,使用ASP.NET ...
- ASP.NET中常用的优化性能的方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...
- asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题
最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception Sys ...
- ASP.NET中Session的sessionState 4种mode模式
1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...
随机推荐
- C#获取windows 10的下载文件夹路径
Windows没有为“下载”文件夹定义CSIDL,并且通过Environment.SpecialFolder枚举无法使用它. 但是,新的Vista 知名文件夹 API确实使用ID定义它FOLDERID ...
- 组态DNS、搜索域名和主机名
一个.组态DNS和搜索领域 特别配置DNS该文件是/etc/resolv.conf:同时,我们可以ifcfg-eth0网卡的配置和其他配置文件中指定的. 演示样本: [root@instructor ...
- VxWorks启动过程的详细解释(上)
vxworks有三个图像: VxWorks Image有三种类型的文件 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...
- Matlab Tricks(二十一)—— 软阈值函数的实现
dj,k^=⎧⎩⎨⎪⎪dj,k−λ,dj,k≥λ0,otherwisedj,k+λ,dj,k≤−λ function y = soft(x, T) y = (x - abs(T) > 0) .* ...
- 数据库访问工具 DBUtl(公孙二狗)
数据库访问工具 DBUtil DBUtil 用于简化数据库的访问,只要准备好配置文件,调用 DBUtil 的静态函数就能直接得到查询数据库的结果. 本文主要内容有: 数据库访问的思考 DBUtil 实 ...
- MEF 插件式开发 - WPF 初体验
原文:MEF 插件式开发 - WPF 初体验 目录 MEF 在 WPF 中的简单应用 加载插件 获取元数据 依赖注入 总结 MEF 在 WPF 中的简单应用 MEF 的开发模式主要适用于插件化的业务场 ...
- 关于WPF后台触发键盘按键
1.变向响应Tab按键 private void Grid_KeyUp(object sender, KeyEventArgs e) { UIElement e ...
- Win8Metro(C#)数字图像处理--2.26图像减法
原文:Win8Metro(C#)数字图像处理--2.26图像减法 [函数名称] 图像减法函数SubtractionProcess(WriteableBitmap src, WriteableBi ...
- Android系统adb命令查看CPU与内存使用率
1. 打开终端,进入上述目录,如下图所示: 2. 输入adb shell,打开adb命令行,如 ...
- WPF判断两个PNG图片是否碰撞
这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...