回到目录

对于目前的网站来说,为了满足高可用,高并发,高负载,一台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组件相关推荐

  1. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    我心中的核心组件(可插拔的AOP)~大话开篇及目录 http://www.cnblogs.com/lori/p/3247905.html 回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是 ...

  2. 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception...

    说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的体现,相关 ...

  3. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)...

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  4. 让烦恼走开 两招让移动硬盘插拔自如

    使用移动硬盘的人越来越多,但很多时候,我们无法通过任务栏托盘区中的删除硬件图标将之删除掉,而强行插拔又担心会损坏移动或其中的数据.有时,一插上移动硬盘,系统马上就会弹出自动播放窗口,供我们选择操作,似 ...

  5. 一次插拔U盘引发的学案

    下午接到某桌面云项目维护人员报的故障,故障表现为"虚拟桌面无法登录" 云平台软件:VMware View Premier 5.0 1 首先登录View Manager,在Deskt ...

  6. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )

    文章目录 一.动态注册广播接收者监听耳机插拔事件 二.jni 层的 Oboe 播放器代码 ( 重新打开 Oboe 音频流 ) 三.相关资料 基于 [Android 高性能音频]Oboe 开发流程 ( ...

  7. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 设置 Oboe 音频设备 ID | setDeviceId 函数原型 | AudioStream 音频流 )

    文章目录 一.设置 Oboe 音频设备 ID ( AAudio ) 二.设置 Oboe 音频设备 ID ( OpenSL ES) 三.oboe :: AudioStreamBuilder :: set ...

  8. stm32f103插拔pc端的串口引起的问题及解决办法

    stm32f103串口和pc端串口进行相连,打印调试信息,插拔PC端的串口后发现程序执行异常,大循环不跑了,一直不停的进入串口接收中断服务程序中.进一步调试发现是触发了中断:USART_FLAG_OR ...

  9. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

最新文章

  1. iOS绘制图片与文字
  2. linux 32位redis安装,CentOS 5.5 32位上安装Redis 2.6报错解决
  3. opencv读取avi视频并抽取帧
  4. flask基础之LocalProxy代理对象(八)
  5. spring mvc字符编码过滤器 CharacterEncodingFilter ,添加例外url
  6. 菜品三级分类_分类器的惊人替代品
  7. python检验阿姆斯特朗数_python 之九九乘法表,润年,奇偶数,阿姆斯特朗数判断分享...
  8. php 什么情况下加异常,PHP中的异常
  9. android 文件上传工具类,Android快速开发架构PlanA(五),文件上传下载了解一下...
  10. Java多线程间的数据共享
  11. 求四科平均成绩c语言,c语言实验报告评语大全
  12. 免费直播系统源码,可控的跑马灯,无需焦点
  13. c# 高级开发应用:防止界面卡死之Application.DoEvents应用
  14. 用Python合并多张EXCEL工作表
  15. 国外广告联盟哪个好,六个高知名度平台
  16. 什么是长尾关键词?长尾关键词优化方法和技巧
  17. php bootstrap 轮播,让Bootstrap轮播插件carousel支持左右滑动手势的三种方法
  18. 自动驾驶——模型预测控制(MPC)理解与实践
  19. 一种字符编码猜测工具的实现方法
  20. 【开发记录】DirectX Custom Graphics Engine(1)

热门文章

  1. 快速理解VirtualBox的四种网络连接方式
  2. 用python实现水仙花数
  3. python 第一安装 https网络请求问题
  4. RAR压缩包审计工具unrar-nofree
  5. Xcode 7.0正式版发布了
  6. 网页图表Highcharts实践教程之认识Highcharts
  7. Playmaker全面实践教程之Playmaker常用工具
  8. java socket 重连复用,20190818 On Java8 第八章 复用
  9. eeglab中文教程系列(2)-绘制脑电头皮图
  10. 感动哭!Starbreeze发布《收获日2》VR版