【新手总结】在.Net项目中使用Redis做为缓存服务

最近因为项目须要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,以前都是本身随便看看写写,很零碎也没沉淀下来什么,此次算是一个系统学习和实践过程的总结。html

 

和Redis有关的基础知识

Redis是一个开源的分布式NoSql数据库,能够用来作缓存服务、消息队列、数据存储等等,数据类型之丰富,效率之高,简直逆天!没有了解过的能够移步去问度娘~客户端之丰富,足可见它的社区有多强大:linux

其中C#的客户端就有这么多:git

没错,咱们的项目里也选择了最热门的StackExchange.Redis做为底层服务。 github

Redis虽然也能够部署在window上,但效率会大打折扣,因此一般都是部署在linux上跑,恰好我在上次部署.net core 项目时建立了一个centos虚拟机,能够直接拿来用,不会配虚拟机的同窗能够点这里。Redis服务部署网上有不少教程,在此就略过了。 web

在这里向你们推荐一款redis图形化操做的客户端Redis Studio,比Redis Desktop Manager好用太多,谁用谁知道!能够查看运行状况、查看数据和类型、查看剩余有效时间、刷新数据、删除数据,甚至能够直接在图形界面配置redis,不再用去配置文件里懵逼了。 redis

固然,以上操做均可以在redis服务开启后用redis-cli工具实现。 数据库

 

基础操做封装

缓存的基础操做无非就是get、set这些,因此统必定义了一个接口: centos

里面用StackExchange.Redis提供的API来实现这些操做,代码太多就不贴出来了。其中对redis的链接作了链接池处理,链接对象ConnectionMultiplexer封装在一个阻塞队列里面,每次读写操做的时候去队列里面取,用完再放回,在应用启动的时候会初始化这个链接池。 缓存

建立链接的时候有两种方式,第一种是使用链接字符串的形式,把须要的参数写在一个字符串中: 服务器

第二种是使用ConfigurationOptions对象:

其中EndPoints是redis服务器的地址,作集群的时候能够写多个。为了搞清楚里面参数的含义,从github上clone了一份StackExchange.Redis的源码来看,很是清晰。在看源码的过程当中发现底层都有记录redis的详细运行状况,但都是写在Stream里,因而本身基于系统的log4net日志而后根据它的实现重写了一套TextWriter来实现日志持久化,用于往后来分析错误:

在作泛型操做封装的时候遇到一个问题:我想把一个复杂对象整存整取。第一个想到的办法是序列化,但总以为这样干会拖累redis的性能,以为不爽不想用。而后是用redis的hash类型,可是操做起来很是不方便,并且没办法存集合,也pass了,其余的类型翻了源码看只支持int、string、bool这些,也不行。没办法仍是序列化吧,而后想起来张善友老师推荐的protobuf,说是性能超级棒,因而就用了,发现它是用Stream来转化的,莫非这就是它性能高的缘由?哪位大神指点下~

 

用redis自定义session存储

缓存服务搭起来后就打算把session搬到里面去,便于作分布式和统一状态管理。很简单,重写一套SessionStateStoreProviderBase就好了,而后跟着园子里焰尾迭的博客《分布式中Redis实现Session终结篇》作了一套,可是发现跑不起来,应该和个人封装有关,因为时间问题就先放下了,直接上nuget找了一个现成的,看中了Microsoft.Web.RedisSessionStateProvider,想着既然是我软官方出的应该没什么大问题,另外这个SessionStateProvider也是依赖于StackExchange.Redis,与项目中的一致因而果断下载安装了。接下来不得不夸一下微软的细节处理啊,下载完立马蹦出个readme告诉我安装结果:

要否则还要研究这个东西怎么用,按照里面的提示打开web.config,发如今<system.web>节点下帮咱们自动加了一个节点sessionState,里面定义了和session有关的配置,最重要的是配置模板都给出来了,连数据类型都标记的清清楚楚:

众所周知微软一直向他的开发者推崇傻瓜式操做,但这些细节真的是太贴心了,根据本身的redis服务器信息配置一下关键信息就ok了。写个session测试一下,页面跑起来了redis里面也查到session值了(被编码了),太TM爽啊~100个大写的赞。。。

 

最后,把系统中临时用的HttpContext.Cache和静态Dictionary所有用redis替换掉,而后build、run、ok。

 

总结

通过这几天的实践算是打开了redis的大门走出了第一步,从此系统开发和运行中确定还会遇到不少问题,也不是说在程序用redis实现get、set就是学会了,如今接触到的只是最基础的东西,后面还要学习一下redis的高级用法,例如pub/sub、master/slave、集群等。

    

问题

一、序列化那里内心仍是有梗,有没有更好的解决方案?并且用protobuf的话要在类名和属性上打标签,这个有点忧桑啊~

二、有人说把session放到redis后能够解决session阻塞的问题,测试了一下好像不行啊,哪位大神知道真相的还请指点一二~

 

 

备注:  文章发布后不少朋友想要代码,前面留下邮箱的已经都发送给你们了,现分享到百度云,你们能够去下载http://yun.baidu.com/s/1hrVIHyG

相关文章
相关标签/搜索