项目经验之:分布式缓存HttpRuntime.cache应用到单点登陆中_优化登陆
以前的设计方案,是我们在数据库中放一个表,用作存储验证登陆成功的用户,并且生成用
户TOKEN(令牌)
分布式缓存+集群的解决方案图:
大概就是这样设计的。。。四台服务器。
我们将存储登陆成功的用户表从数据库中分离出来,放到缓存中。并利用集群建立四台服务器缓存同步更新。。。。
在登陆时,我们读了缓存中的Token,同时遍历IP集群中配置的服务器地址。同步四台服务器之间的Token缓存。。。。。
相应的代码:
DE层中配置文件:

CacheBase.cs 缓存基类
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security;
using System.Web.Caching;
using System.Web;
using System.ServiceModel;
using System.Reflection;
using HttpRuntimeCacheDE.CacheService;
namespace HttpRuntimeCacheDE.Cache
{
public class CacheBase
{
private CacheServiceSoapClient client = null ;
private CacheService.LoginStatusParam cParam = new CacheService.LoginStatusParam();
private CacheService.CacheOperation cOperation = new CacheService.CacheOperation();
/// <summary>
/// 发送用于同步集群中的Cache数据
/// </summary>
/// <param name="param"> Cache数据 </param>
public void SendCacheData(CacheParam param, CacheOperation operation)
{
string [] ips = CacheConfig.ClusterGroupAddr;
foreach ( string ip in ips)
{
try
{
client = new CacheService.CacheServiceSoapClient();
EndpointAddress address = new EndpointAddress( " http:// " + ip + @" / " + CacheConfig.WebSiteName + " /CacheService.asmx " );
client.Endpoint.Address = address;
RemoteParamConvert(cParam, param);
switch (operation)
{
case CacheOperation.Add:
cOperation = CacheService.CacheOperation.Add;
break ;
case CacheOperation.Edit:
cOperation = CacheService.CacheOperation.Edit;
break ;
case CacheOperation.Delete:
cOperation = CacheService.CacheOperation.Delete;
break ;
default :
break ;
}
client.GetCacheData(cParam, cOperation);
}
catch
{
continue ;
}
}
}
/// <summary>
/// 用于同步集群中的Cache数据
/// </summary>
/// <param name="param"> Cache数据 </param>
/// <param name="operation"> Cache操作类型 </param>
public void SyncCacheData(CacheParam param, CacheOperation operation)
{
switch (operation)
{
case CacheOperation.Add:
AddCache(param);
break ;
case CacheOperation.Edit:
EditCache(param);
break ;
case CacheOperation.Delete:
DeleteCache(param);
break ;
default :
break ;
}
}
// 增加Cache数据
protected virtual void AddCache(CacheParam param)
{
string key = BuildCacheKey(param);
HttpRuntime.Cache.Add(key, param, null , DateTime.Now.AddHours( 1 ), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.High, null );
}
// 修改Cache数据
protected virtual void EditCache(CacheParam param)
{
string key = BuildCacheKey(param);
HttpRuntime.Cache.Remove(key);
AddCache(param);
}
// 删除Cache数据
protected virtual void DeleteCache(CacheParam param)
{
string key = BuildCacheKey(param);
HttpRuntime.Cache.Remove(key);
}
// 生成在线的Cache Key
protected virtual string BuildCacheKey(CacheParam param)
{
retu "" ;
}
// 将本地参数转换成远程调用的参数
private void RemoteParamConvert( object sourceObj, object targetObj)
{
try
{
PropertyInfo[] sourceInfo = sourceObj.GetType().GetProperties();
PropertyInfo[] targetInfo = targetObj.GetType().GetProperties();
for ( int i = 0 ; i < sourceInfo.Length; i ++ )
{
if (sourceInfo[i].Name == targetInfo[i].Name)
{
object targetValue = targetInfo[i].GetValue(targetObj, null );
if ( ! ParamFunc.Judgement(targetValue))
continue ;
sourceInfo[i].SetValue(sourceObj, targetValue, null );
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}
/// <summary>
/// Cache同步操作类型
/// </summary>
public enum CacheOperation
{
Add,
Edit,
Delete
}
}
CacheFunc.cs 缓存操作函数

作者:GIS发展
来源链接:https://www.cnblogs.com/accpfriend/archive/2009/06/03/1494773.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。