我心中的核心组件(可插拔的AOP)~分布式Session组件
回到目录
对于目前的网站来说,为了满足高可用,高并发,高负载,一台WEB服务器已经远远不够用了,以后的WEB应用服务器应该是一种集群的环境,它们之间使用一些工具进行数据的同步,在由1台变成多台服务器时,有一个问题是我们必须要考虑的,Session机制,我们都知道Session被用来存储用户的一些凭证信息,持久化到服务器上,这在安全性方面得到了保证(比存储到客户端的cookies),而当你的WEB应用服务器是多台时(多台之间做了负载均衡),这种Session机制就有问题了,因为你无法实现从一台服务器到别一台服务器的内存(缓存)共享,这也是不安全的,所以,在出现缓存中间件出现之后,就有了一种新的技术也跟着出现了,即Session中间件,比较成熟的组件是StackExchange.Redis+RedisSessionStateProvider,即使用Redis实现的Session机制,它将session数据存储到了一台(可以是redis集群)redis服务器上,这时,多台WEB应用服务器之间的数据就是唯一的了,不需要进行同步了。
下面介绍实现步骤
1 使用nuget安装redis缓存 StackExchange.Redis
2 使用nuget安装RedisSession服务 RedisSessionStateProvider
3 从nuget添加RedisSession之后,它会在你的config文件中写入以下内容,主要是对session进行持久化设置的
<sessionState mode="Custom" customProvider="MySessionStateStore"><providers><!-- Either use 'connectionString' and provide all parameters as string OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. --><!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. --><!--<add name="MySessionStateStore"host = "127.0.0.1" [String]port = "" [number]accessKey = "" [String]ssl = "false" [true|false]throwOnError = "true" [true|false]retryTimeoutInMilliseconds = "5000" [number]databaseId = "0" [number]applicationName = "" [String]connectionTimeoutInMilliseconds = "5000" [number]operationTimeoutInMilliseconds = "1000" [number]connectionString = "<Valid StackExchange.Redis connection string>" [String]loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]loggingMethodName = "<Logging method should be defined in loggingClass. It should be public, static, does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]/>--><add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" /></providers></sessionState>
4 下载是新版本的redis服务端,可以是windows版的,我用的是2.6.13,低版本的redis会出现Eval命令无法识别的问题
5 处理完成,可以测试你的session了,默认过期时间为1200秒
前台使用Session时和原来没有任何分别
public ActionResult TestSession(){Session["username"] = "zzl";Session["test"] = "hello world!";return Content("完成..." + Session["test"]);}
这种不修改以有代码就可以实现不同功能策略的方式就是我们的IoC,控制反转技术(也是依赖注入DI的范畴),这也是编程语言发展到一定阶段的必然产物,即解决复杂的业务的应对之道!
下面是网友对rediscache进行的扩展,让它支持复杂类型,默认支持简单类型,如果希望支持复杂类型,需要为类型添加“可序列化”的特性,因为我们在redis里存储时,都是以二进制字节数组的形式存储的。
/// <summary>/// 对RedisCache的扩展,让它支持复杂类型、/// RedisValue 类型可以直接使用字节数组,因此,/// 调用 Get 帮助程序方法时,它会将对象序列化为字节流,然后再缓存该对象。/// 检索项目时,项目会重新序列化为对象,然后返回给调用程序。/// </summary>public static class SampleStackExchangeRedisExtensions{public static T Get<T>(this IDatabase cache, string key){return Deserialize<T>(cache.StringGet(key));}public static object Get(this IDatabase cache, string key){return Deserialize<object>(cache.StringGet(key));}public static void Set(this IDatabase cache, string key, object value){cache.StringSet(key, Serialize(value));}static byte[] Serialize(object o){if (o == null){return null;}BinaryFormatter binaryFormatter = new BinaryFormatter();using (MemoryStream memoryStream = new MemoryStream()){binaryFormatter.Serialize(memoryStream, o);byte[] objectDataAsStream = memoryStream.ToArray();return objectDataAsStream;}}static T Deserialize<T>(byte[] stream){if (stream == null){return default(T);}BinaryFormatter binaryFormatter = new BinaryFormatter();using (MemoryStream memoryStream = new MemoryStream(stream)){T result = (T)binaryFormatter.Deserialize(memoryStream);return result;}}}
对复杂类型进行存储和读取的方法如下
cache.Set("zzlList", new List<TestCache> { new TestCache { ID = 1, Name = "占占", AddTime = DateTime.Now } });var o = cache.Get("zzlList");
回到目录
我心中的核心组件(可插拔的AOP)~分布式Session组件相关推荐
- 我心中的核心组件(可插拔的AOP)~大话开篇及目录
我心中的核心组件(可插拔的AOP)~大话开篇及目录 http://www.cnblogs.com/lori/p/3247905.html 回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是 ...
- 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception...
说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的体现,相关 ...
- 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)...
回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回 日志记录组件之自主的Vlog>和<第三回 日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...
- 让烦恼走开 两招让移动硬盘插拔自如
使用移动硬盘的人越来越多,但很多时候,我们无法通过任务栏托盘区中的删除硬件图标将之删除掉,而强行插拔又担心会损坏移动或其中的数据.有时,一插上移动硬盘,系统马上就会弹出自动播放窗口,供我们选择操作,似 ...
- 一次插拔U盘引发的学案
下午接到某桌面云项目维护人员报的故障,故障表现为"虚拟桌面无法登录" 云平台软件:VMware View Premier 5.0 1 首先登录View Manager,在Deskt ...
- 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )
文章目录 一.动态注册广播接收者监听耳机插拔事件 二.jni 层的 Oboe 播放器代码 ( 重新打开 Oboe 音频流 ) 三.相关资料 基于 [Android 高性能音频]Oboe 开发流程 ( ...
- 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 设置 Oboe 音频设备 ID | setDeviceId 函数原型 | AudioStream 音频流 )
文章目录 一.设置 Oboe 音频设备 ID ( AAudio ) 二.设置 Oboe 音频设备 ID ( OpenSL ES) 三.oboe :: AudioStreamBuilder :: set ...
- stm32f103插拔pc端的串口引起的问题及解决办法
stm32f103串口和pc端串口进行相连,打印调试信息,插拔PC端的串口后发现程序执行异常,大循环不跑了,一直不停的进入串口接收中断服务程序中.进一步调试发现是触发了中断:USART_FLAG_OR ...
- 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...
最新文章
- iOS绘制图片与文字
- linux 32位redis安装,CentOS 5.5 32位上安装Redis 2.6报错解决
- opencv读取avi视频并抽取帧
- flask基础之LocalProxy代理对象(八)
- spring mvc字符编码过滤器 CharacterEncodingFilter ,添加例外url
- 菜品三级分类_分类器的惊人替代品
- python检验阿姆斯特朗数_python 之九九乘法表,润年,奇偶数,阿姆斯特朗数判断分享...
- php 什么情况下加异常,PHP中的异常
- android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...
- Java多线程间的数据共享
- 求四科平均成绩c语言,c语言实验报告评语大全
- 免费直播系统源码,可控的跑马灯,无需焦点
- c# 高级开发应用:防止界面卡死之Application.DoEvents应用
- 用Python合并多张EXCEL工作表
- 国外广告联盟哪个好,六个高知名度平台
- 什么是长尾关键词?长尾关键词优化方法和技巧
- php bootstrap 轮播,让Bootstrap轮播插件carousel支持左右滑动手势的三种方法
- 自动驾驶——模型预测控制(MPC)理解与实践
- 一种字符编码猜测工具的实现方法
- 【开发记录】DirectX Custom Graphics Engine(1)