该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-22
另外使用memcached作session server一定要注意设置足够大的内存,因为memcached是作为一个cache server而设计的,当增加新的session时,如果memcached的内存不足,会使用memcached设定的算法(先进先出之类的)把之前的session移除,可能造成一部分未失效的session相关联的用户无法登陆。
|
|
返回顶楼 | |
发表时间:2007-05-22
balaschen 写道 另外使用memcached作session server一定要注意设置足够大的内存,因为memcached是作为一个cache server而设计的,当增加新的session时,如果memcached的内存不足,会使用memcached设定的算法(先进先出之类的)把之前的session移除,可能造成一部分未失效的session相关联的用户无法登陆。
赞同,memcached足够大的情况下才可以。 |
|
返回顶楼 | |
发表时间:2007-05-23
balaschen 写道 我倾向于不在session存放业务数据,在session一般只存放userId信息,所以session中存储的数据是不会变的,而与session相关的数据,不如购物车之类的,由相应的业务逻辑来处理(要不要cache和如何cache是业务逻辑层的事情),毕竟在业务逻辑层cache数据比在tomcat这个层面简单多了。
既然session存储的数据不会变,自然也就不需要oscache之类支持cluster的cache了,只要一个简单map的可以,map找不到再到memcached server找(基本上可以重用tomcat原先的session实现),当然如果你的设计会把一些可能变化的数据放到session中,确实需要使用oscache。 PS:oscache应该是一级cache,memcached才是二级cache吧 我也赞同session里面只放些userid的信息,小对象如String,不赞成放list等业务数据或大对象。但是我看过太多的项目都把大对象放到session里。出于对老项目的支持,加上oscache多种选择,还是有好处的 |
|
返回顶楼 | |
发表时间:2007-05-23
把list等业务数据或大对象放到session是不好的事情,但如果真的要来不同的页面之间传递,那该放到什么地方呢?很想知道!
|
|
返回顶楼 | |
发表时间:2007-05-23
laoer 写道 balaschen 写道 另外使用memcached作session server一定要注意设置足够大的内存,因为memcached是作为一个cache server而设计的,当增加新的session时,如果memcached的内存不足,会使用memcached设定的算法(先进先出之类的)把之前的session移除,可能造成一部分未失效的session相关联的用户无法登陆。
赞同,memcached足够大的情况下才可以。 如果是命令行方式,可以增加 -M选项关闭LRU算法,如果是想用配置文件,可以到http://www.iteye.com/topic/24505 下载新的版本,我刚刚更新到1.2.1版本 |
|
返回顶楼 | |
发表时间:2007-05-23
streamfly 写道 把list等业务数据或大对象放到session是不好的事情,但如果真的要来不同的页面之间传递,那该放到什么地方呢?很想知道!
一般来说,我会做一个sessionContext,使用theadlocal来保存当前线程上下文相关数据,如果数据是在多个请求之间共用,可以把这部分数据放到缓存或数据库(主要看你的这部分数据有无持久化的需要),这样不仅可以在view层共享,也可以在业务逻辑层访问这部分数据。另外增加一个CloseSessionListener,在session失效时清除不必要的数据(也可以利用cache的失效机制) |
|
返回顶楼 | |
发表时间:2007-05-23
robbin 写道 你的工作很有价值!使得普通Java Web应用在tomcat上面一下具备了SNA架构的能力,有空的时候我会测试一下你的方案,review一下代码。
SNA应该指的是不同的请求之间share nothing吧。 从这个角度说,用memcached自己实现一个session其实和实现session stick并没有本质的区别。 之所以要谨慎使用容器自带的HttpSession,还是因为HttpSession本身的性能有问题吧。 |
|
返回顶楼 | |
发表时间:2007-05-23
pupi 写道 robbin 写道 你的工作很有价值!使得普通Java Web应用在tomcat上面一下具备了SNA架构的能力,有空的时候我会测试一下你的方案,review一下代码。
SNA应该指的是不同的请求之间share nothing吧。 从这个角度说,用memcached自己实现一个session其实和实现session stick并没有本质的区别。 之所以要谨慎使用容器自带的HttpSession,还是因为HttpSession本身的性能有问题吧。 首先使用session stick很耗性能,因为是在应用层处理session stick 其次,当某个webap当机的时候,必须重新登陆(如果要避免重新登陆,则必须实现session复制) 所以所谓的粘性session解决方案并非是share nothing |
|
返回顶楼 | |
发表时间:2007-05-23
balaschen 写道 pupi 写道 robbin 写道 你的工作很有价值!使得普通Java Web应用在tomcat上面一下具备了SNA架构的能力,有空的时候我会测试一下你的方案,review一下代码。
SNA应该指的是不同的请求之间share nothing吧。 从这个角度说,用memcached自己实现一个session其实和实现session stick并没有本质的区别。 之所以要谨慎使用容器自带的HttpSession,还是因为HttpSession本身的性能有问题吧。 首先使用session stick很耗性能,因为是在应用层处理session stick 其次,当某个webap当机的时候,必须重新登陆(如果要避免重新登陆,则必须实现session复制) 所以所谓的粘性session解决方案并非是share nothing 是这么回事。 不过session stick的方案,也可以用cookie的方式类解决重复登陆的问题。 |
|
返回顶楼 | |
发表时间:2007-05-23
pupi 写道 balaschen 写道 pupi 写道 robbin 写道 你的工作很有价值!使得普通Java Web应用在tomcat上面一下具备了SNA架构的能力,有空的时候我会测试一下你的方案,review一下代码。
SNA应该指的是不同的请求之间share nothing吧。 从这个角度说,用memcached自己实现一个session其实和实现session stick并没有本质的区别。 之所以要谨慎使用容器自带的HttpSession,还是因为HttpSession本身的性能有问题吧。 首先使用session stick很耗性能,因为是在应用层处理session stick 其次,当某个webap当机的时候,必须重新登陆(如果要避免重新登陆,则必须实现session复制) 所以所谓的粘性session解决方案并非是share nothing 是这么回事。 不过session stick的方案,也可以用cookie的方式类解决重复登陆的问题。 这不单单是一个重复登陆的问题,是sticky无法保证failureover,我是说在集群的时候,而replication对性能影响又大,所以才会想到用分布式缓存来做取代方案把 |
|
返回顶楼 | |