.Net 基于Memcache集群的分布式Session
简述
基于Memcache的Session大家都各有各的说法,比方说:当memcached集群发生故障(比如内存溢出)或者维护(比如升级、增加或减少服务器)时,用户会无法登录,或者被踢掉线等等,每种技术各有优缺点,只是适应的场景不同罢了。
知识点补充
服务器Memcache配置:https://www.cnblogs.com/chenyanbin/p/11415368.html
Memcache集群配置:https://www.cnblogs.com/chenyanbin/p/11441490.html
Mvc校验用户是否登陆:https://www.cnblogs.com/chenyanbin/p/11397576.html
演示代码使用的其他完整类库:https://www.cnblogs.com/chenyanbin/p/11186495.html
代码演示(.Net的Mvc架构):
登陆页控制器
IBllSession bllSession = BllSessionFactory.GetCurrentBllSession(); //业务层基类
/// <summary>
/// 处理登陆的表单
/// </summary>
/// <returns></returns>
public ActionResult ProcessLogin()
{
try
{
string user_name = Request["LoginId"]; //用户名
string user_pwd = Request["LoginPwd"]; //密码
UserInfo model = new UserInfo(); //实体类
model.UName = user_name; //实体类赋值
model.UPwd = user_pwd;
if (bllSession.UserInfo.Select(model).Count > ) //判断用户名密码是否正确
{
//旧方法
//Session["loginUser"] = user_name; //新方法
//Memcache+Cookie替代Session登陆
//立即分配一个标志GUID,把标志作为Memcache存储数据的key,把用户对象放到Memcache,把GUID写到客户端cookie里面去
string userLoginId = Guid.NewGuid().ToString(); //生成一个随机GUID
//将用户的数据写入Memcache
MemcacheHelper.AddCache(userLoginId, user_name, DateTime.Now.AddMinutes()); //Memcache帮助类
//往客户端写入Cookie
Response.Cookies["userLoginId"].Value= userLoginId; //将GUID写入Cookie
return Content("ok");
}
else
{
return Content("用户名或密码错误!你会登陆吗?");
}
}
catch (Exception ex)
{
throw ex;
}
}
过滤器基类(判断用户是否登陆)
using Sam.OA.Common;
using System;
using System.Web.Mvc; namespace Sam.OA.WEBAPP.Controllers
{
/// <summary>
/// 控制器基类帮助类
/// 作者:陈彦斌
/// 更新时间:2019年9月1日17:43:10
/// </summary>
public class BaseController:Controller
{
public bool IsCheckedUserLogin = true;
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
//校验用户是否已登录
if (IsCheckedUserLogin )
{
//新方法
//使用Memcache+Cookie代替Session
if (Request.Cookies["userLoginId"] == null)
{
filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
return;
}
string userGuid = Request.Cookies["userLoginId"].Value; //拿到用户的GUID
object obj = MemcacheHelper.GetCache(userGuid);
if (obj == null || obj.ToString() == "")
{
//用户长时间不操作,超时
filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
}
//滑动窗口机制
MemcacheHelper.SetCache(userGuid, obj, DateTime.Now.AddMinutes()); //旧方法Session
//if (filterContext.HttpContext.Session["loginUser"] == null)
//{
// filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
//}
}
}
}
}
Memcache帮助类(MemcacheHelper.cs)
using Memcached.ClientLibrary;
using System; namespace Sam.OA.Common
{
/// <summary>
/// Memcache缓存帮助类
/// 作者:陈彦斌
/// 时间:2019年9月1日15:48:12
/// </summary>
public sealed class MemcacheHelper
{
private static MemcachedClient memcachedClient;
static MemcacheHelper()
{
//分布式Memcached服务器ip 端口
string strAppMemcached = DbUtil.memcacheServiceList;
if (strAppMemcached==""|| strAppMemcached==null)
{
throw new Exception("Memcache远程服务器Ip和端口未配置");
}
string[] servers = strAppMemcached.Split(','); //Memcache机器IP
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(servers); //关联连接池
pool.InitConnections = ; //初始化链接
pool.MinConnections = ; //最小连接数
pool.MaxConnections = ; //最大连接数
pool.SocketConnectTimeout = ; //Socket超时连接时间
pool.SocketTimeout = ; //Socket超时时间
pool.MaintenanceSleep = ; //Socket休眠时间
pool.Failover = true;
pool.Nagle = false;
pool.Initialize(); //初始化
//客户端实例
if (memcachedClient == null)
{
memcachedClient = new MemcachedClient();
}
memcachedClient.EnableCompression = false; //启动压缩
}
/// <summary>
/// 获取Memcache缓存数据
/// </summary>
/// <param name="CacheKey">键</param>
/// <returns></returns>
public static object GetCache(string CacheKey)
{
return memcachedClient.Get(CacheKey);
}
/// <summary>
/// 设置Memcache缓存数据
/// </summary>
/// <param name="CacheKey">键</param>
/// <param name="CacheValue">值</param>
public static void AddCache(string CacheKey, object CacheValue)
{
memcachedClient.Add(CacheKey, CacheValue);
}
/// <summary>
/// 设置Memcache缓存数据
/// </summary>
/// <param name="CacheKey">键</param>
/// <param name="CacheValue">值</param>
/// <param name="expDate">过期时间</param>
public static void AddCache(string CacheKey, object CacheValue, DateTime expDate)
{
memcachedClient.Add(CacheKey, CacheValue,expDate);
}
/// <summary>
/// 设置Memcache缓存数据,key存在则更新,否则新增
/// </summary>
/// <param name="CacheKey">键</param>
/// <param name="CacheValue">值</param>
public static void SetCache(string CacheKey, object CacheValue)
{
memcachedClient.Set(CacheKey, CacheValue);
}
/// <summary>
/// 设置Memcache缓存数据,key存在则更新,否则新增
/// </summary>
/// <param name="CacheKey">键</param>
/// <param name="CacheValue">值</param>
/// <param name="expDate">过期时间</param>
public static void SetCache(string CacheKey, object CacheValue, DateTime expDate)
{
memcachedClient.Set(CacheKey, CacheValue, expDate);
}
}
}
觉得对你有帮助的话,帮忙推荐下,还有不懂的地方,欢迎下方留言,明天继续更新Redis!~~
.Net 基于Memcache集群的分布式Session的更多相关文章
- spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)
一,为什么要使用分布式session? HpptSession默认使用内存来管理Session,如果将应用横向扩展将会出现Session共享问题, 所以我们在创建web集群时,把session保存到r ...
- 负载均衡集群中的session解决方案【转】
通常面临的问题 从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后,服务器A上保留了用户的登录信息:当用户再次发送请求时, 根据负载均衡策略可能被代理到后端不同的服务器,例如 ...
- redis 与java的连接 和集群环境下Session管理
redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html) 第一步: a) 搭建环境 引入 jedis jar包 co ...
- nginx负载均衡集群中的session共享说明
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- C# Memcache集群原理、客户端配置详细解析
概述 memcache是一套开放源的分布式高速缓存系统.由服务端和客户端组成,以守护程序(监听)方式运行于一个或多个服务器中,随时会接收客户端的连接和操作.memcache主要把数据对象缓存到内存中, ...
- Nginx+PHP负载均衡集群环境中Session共享方案 - 运维笔记
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- redis内存分配管理与集群环境下Session管理
##################内存管理############### 1.Redis的内存管理 .与memcache不同,没有实现自己的内存池 .在2..4以前,默认使用标准的内存分配函数(li ...
- 解决应用服务器变为集群后的Session问题
2.2.4.2 解决应用服务器变为集群后的Session问题 先来看一下什么是Session. 用户使用网站的服务,基本上需要浏览器与Web 服务器的多次交互.HTTP 协议本身是无状态的,需要基于H ...
- Quartz集成springMVC 的方案二(持久化任务、集群和分布式)
Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等. Quartz核心是调度器,还采用多线程管理. 1.持久化任务:当应用程序停止运行时,所有调度信 ...
随机推荐
- 我对微服务、SpringCloud、k8s、Istio的一些杂想
一.微服务与SOA “微服务”是一个名词,没有这个名词之前也有“微服务”,一个朗朗上口的名词能让大家产生一个认知共识,这对推动一个事务的发展挺重要的,不然你叫微服务他叫小服务的大家很难集中到一个点上. ...
- CentOS EPEL yum源
CentOS EPEL yum源 用yum安装软件时,经常发现我们的yum源里面没有该软件,比如htop.网上查到的一个方案是需要自己去wget源码,然后configure,make,make ins ...
- vue 移动端/PC常见问题及解决方法
一.判断手机/PC浏览器语言 navigator.language // 返回语言代码 语言代码文档: http://www.lingoes.cn/zh/translator/langcode.htm ...
- memcached.c 源码分析
上文分析了memcached的autoconf过程以及configure, make过程,可以看到,memcached可执行文件是由memcached-memcached.o以及其他文件连接后编译出来 ...
- HDP Hive性能调优
(官方文档翻译整理及总结) 一.优化数据仓库 ① Hive LLAP 是一项接近实时结果查询的技术,可用于BI工具以及网络看板的应用,能够将数据仓库的查询时间缩短到15秒之内,这样的查询称之为Int ...
- cogs 1317. 数列操作C 区间修改 区间查询
1317. 数列操作C ★★★ 输入文件:shuliec.in 输出文件:shuliec.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 假设有一个长度为 n( ...
- 使用 Netty 实现一个 MVC 框架
NettyMVC 上面介绍 Netty 能做是什么时我们说过,相比于 SpringMVC 等框架,Netty 没提供路由等功能,这也契合和 Netty 的设计思路,它更贴近底层.下面我们在 Netty ...
- 使用 OpenSSL 为 Nginx 创建自签名证书 并开启客户端身份验证
本文章默认读者了解Openssl,CA,网站证书相关知识,直接实战!配置完成后,浏览器会显示"安全的HTTPS"连接.不会像其他文章那样,是红色警告的证书提示. 准备环境 笔者使用 ...
- 【Java笔记】【Java核心技术卷1】chapter3 D4变量
package chapter3; public class D4变量 { public static final int BBB=100; //类常量 public static void main ...
- 一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)
1.目的:实现客户端向服务器发送数据 原理: 2.建立两个控制台应用,一个为服务器,用于接收数据.一个为客户端,用于发送数据. 关键类与对应方法: 1)类IPEndPoint: 1.是抽象类EndPo ...