情景: 多台服务器, 不特别配置,Session只会在某一个服务器上,导致用户打开页面的时候,如果用的另一个服务器,会让重新登录.
问题一: 那 Application 是每个服务器上一个呢 ,还是几个服务器共享一个?
问题二: 配置session共享或者强制用户只登陆某个服务器,都会有弊端,有没有别的替代方法?
1、Application是一个应用程序一个,和服务器无关哈。
2、修改Session的存储模式,默认是InProc,可以修改为数据库存储,这个时候可以用Redis,Memcached,Sql Server来存储用户的Session。分布式上一般都是这种用法。
额。我是说在 Application_Start 事件中可以这样写:
Application["PageSize"] = 18
Application["VisitCount"] = 0
就是存放一些全局通用的值 或者记录访问次数的内容。
在需要用到的时候就可以直接使用了。
其实常量倒无所谓了。就是说 Application["VisitCount"] 他在每次页面加载的时候都会加一,所以我的疑问是如果网站部署在很多服务器上,这个次数是累加的还是每个服务器上维持着一个 Application["VisitCount"]。
我也知道这种用法现在不常用了,只是感到疑惑而已,求解答
@最爱左手: 每个应用程序维护一个。因为一台服务器可以部署多个应用程序。
@幻天芒: 那就是说在分布式服务器中部署该网站,用 Application["VisitCount"] 取不到总的访问数目了?
@最爱左手: 是的,只能获取到访问单个应用的用户总数。
Application :顾名思义 是应用程序的意思,一个进程就是一个application
Session:是用户状态信息
一般来说如果用Cookie作为登录的SessionKey,同一个域名下肯定不会有共享问题啊。
想不通你是怎么识别用户的 不用Cookie的时候?
如果用 session的话,服务器会生成一个 SessionID 保存到客户端,当用户打开其他页面的时候,会将本地Cookie 中的 SessionID 发送到服务器匹配。如果匹配到则不用重新登录。
现在的问题是,如果有多台服务器,当你登录时,Session只会保存在某一个服务器上,如果你打开其他页面的时候登录的是其他的服务器的话,会找不到Seesion,让你重新登录。
不过经过配置,可以实现Session 共享 或者 让当前用户强制登录某一个服务器,这样就解决了重新登录的问题,但是也会额外付出一些性能消耗。所以问有没有可以替代 Seesion的方法。
@最爱左手: 哈, sorry,我想错了。
问题其实归根结底就是Session如何共享的问题。不经过配置是不行的。下边幻天芒的解答是对的,建议走缓存 redis/mem 不然性能不高
1. 可以用进程外session来实现,
2. 用memcached来做session这一块
1 Memcahed 与 Redis 哪个更好呢?
2 另外就是上面的第一个问题,Application 在多台服务器的情况下是跟 Seesion一样么,每台服务器存一个Application?
@最爱左手: 缓存我感觉memcache好一些,这样可以避免数据量大的时候,session失效的问题