前面咱们写过C#在redis中存储经常使用的5种数据类型demo,没看过的能够点击电梯直达:https://www.cnblogs.com/xiongze520/p/10267804.htmlhtml
咱们上一篇说到Windows7系统中使用nginx部署服务器集群:https://www.cnblogs.com/xiongze520/p/10308720.htmlnginx
部署完成后咱们对于session的共享没有完成,以前小编想作一个session服务器作共享,而后看到评论AjuPrince和三当家的方法,我决定使用第三方缓存(redis)redis
解决session共享问题。经过查询资料整理以下设计:数据库
Session的实现原理:缓存
Session共享实现:服务器
传统的session由服务器端生成并存储,当应用进行分布式集群部署的时候,如何保证不一样服务器上session信息可以共享呢?cookie
两种实现方式:session
基于session集中存储的实现方案:分布式
Redis存储session的须要考虑问题:memcached
实现:
考虑到session中数据相似map的结构,采用redis中hash存储session数据比较合适,若是使用单个value存储session数据,不加锁的状况下,就会存在session覆盖的问题,所以使用hash存储session,每次只保存本次变动session属性的数据,避免了锁处理,性能更好。
若是每改一个session的属性就触发存储,在变动较多session属性时会触发屡次redis写操做,对性能也会有影响,咱们是在每次请求处理完后,作一次session的写入,而且之写入变动过的属性。
若是本次没有作session的更改, 是不会作redis写入的,仅当没有变动的session超过一个时间阀值(不变动session刷新过时时间的阀值),就会触发session保存,以便session可以延长有效期。
demo演示:
咱们仍是使用上传的demo进行稍加修改:
不用说,咱们首先启动redis,不知道的能够点击电梯直达:https://www.cnblogs.com/xiongze520/p/10267804.html
而后代码以下:
using ServiceStack.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RedisApplication { class Program { static void Main(string[] args) { //创建Redis客户端类,构造函数(安装Redis服务器的服务器ip,端口号) RedisClient client = new RedisClient("192.168.0.43", 6379); //连接Redis服务器 client.FlushAll(); //命令用于清空整个Redis服务器的数据(删除全部数据库的全部密钥)。 //-----------------将数据存入Redis----------------- //SetEntryInHash(hashid,key,value) hashid是惟一标识符 client.SetEntryInHash("HashID", "Name", "张三"); client.SetEntryInHash("HashID", "Age", "24"); client.SetEntryInHash("HashID", "Sex", "男"); client.SetEntryInHash("HashID", "Address", "上海市XX号XX室"); client.SetEntryInHash("HashID2", "Name", "张三"); client.SetEntryInHash("HashID2", "Age", "24"); client.SetEntryInHash("HashID2", "Sex", "男"); client.SetEntryInHash("HashID2", "Address", "上海市XX号XX室"); //-----------------读取存入的数据----------------- List<string> HaskKey = client.GetHashKeys("HashID"); foreach (string key in HaskKey) { Console.WriteLine("HashID--Key:{0}", key); } List<string> HaskKey2 = client.GetHashKeys("HashID2"); foreach (string key in HaskKey2) { Console.WriteLine("HashID2--Key:{0}", key); } //-----------------删除对象----------------- //client.RemoveEntryFromHash("HashID", "Name"); } } }
咱们获取指定的key,运行效果图以下:
这样就完成redis存储和session共享的问题了,避免iis的session不共享和覆盖问题。
有不一样的解决方案能够在评论区套路套路。