<!--StartFragment-->
参考了网上一些资料,实现了session通过filter存储到memcached服务器上.
(参见: http://ooft.javaeye.com/blog/537841 )
实现方式:
a)通过MemcachedSessionFilter过滤器拦截cookie,取得的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用.
b)继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法呢,都通过SessionService类来实现.
c)SessionService连接memcached服务,以sessionId作为key,存取的对象是一个map.map的内容即为session的内容.
d)读取数据时,先通过sessionId从memcached服务器上获取整个map对象,再以session的attributeName作为key从map中获取数据对象.写数据的方式与读数据类似,先获取map,然后修改map中的值,然后将整个map保存到memcached服务器上.
改进内容:
(1)使用xmemcached客户端代替java memcached client.
XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。
(2)对修改和删除session属性时,使用cas方法实现,防止在并发时出现数据覆盖的问题.
原来的代码:
- publicvoidsaveSession(Stringid,Mapsession){
-
longs1=System.currentTimeMillis();
-
MemCachedClientmc=this.getMemCachedClient();
- mc.replace(id,session);
-
System.out.print("saveSession");
- System.out.println(System.currentTimeMillis()-s1);
- }
public void saveSession(String id, Map session) {
long s1= System.currentTimeMillis();
MemCachedClient mc = this.getMemCachedClient();
mc.replace(id, session);
System.out.print("saveSession");
System.out.println(System.currentTimeMillis() -s1);
}
其中保存进去的session是一个通过get方法从memcached上获取的map对象,将map中的值修改以后,将map对象替换服务器上的对象.如果在多台机器并发的情况下,很可能出现一个线程写进去的数据被其它的覆盖.
改进后的代码:
Memcached是通过cas协议实现原子更新,所谓原子更新就是compare and set,原理类似乐观锁,每次请求存储某个数据同时要附带一个cas值,memcached比对这个cas值与当前存储数据的cas值是否相等,如果相等就让新的数据覆盖老的数据,如果不相等就认为更新失败,这在并发环境下特别有用。
- publicvoidsaveSession(Stringid,Stringkey,Objectarg1){
-
longs1=System.currentTimeMillis();
-
finalStringk=key;
-
finalObjecto=arg1;
-
try{
-
mc.cas(id,0,newCASOperation<Map>(){
-
-
publicintgetMaxTries(){
-
return5;
- }
-
publicMapgetNewValue(longcurrentCAS,Mapmap){
- map.put(k,o);
-
returnmap;
- }});
-
System.out.print("saveSession");
- }
-
finally{
- System.out.println(System.currentTimeMillis()-s1);
- }
- }
分享到:
相关推荐
分布式环境下改进的BloomFilter过滤技术
#资源达人分享计划#
基于filter机制。 优点 支持多种序列化方式,默认使用Java自带的Serializable方式(兼容性最好); 支持多种Session存储方案,默认是redis; 合并session的写操作,一个request里的多次session操作,只会写一次缓存...
分布式环境下改进的BloomFilter过滤技术.pdf
添加Redis :: Bloomfilter类,该类可用作Redis上的分布式bloom过滤器实现。 布隆过滤器是一种节省空间的概率数据结构,用于测试元素是否为集合的成员。安装$ gem install redis-bloomfilter测验$ bundle install$ ...
23_布隆过滤器BloomFilter理论知识 24_布隆过滤器理论复习 25_缓存雪崩 26_缓存穿透和bloomFilter-helloworld 27_Guava解决缓存穿透 28_Redis布隆过滤器解决缓存穿透 29_docker安装rebloom 30_缓存击穿简介 31_高...
如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...
本案例中 使用maven 搭建spring boot 基本案例 其中实现了 用户登录功能,实现Filter 和 拦截器两种方式 来过滤session登录,后续会使用token方式,请大家关注
j2ee项目使用filter和memcached实现session服务器
针对流与流之间传输的公平性问题,基于BLUE算法,结合Bloom filter,提出了一种改进的AQM算法EFBLUE。通过仿真实验对新算法从分组丢失率、吞吐量、延时等方面的性能进行了测试并与RED算法进行了性能对比。NS2仿真实验...
karaf中不同bundle之间session共享实现,将代码用maven打下包,放入karaf,即可提供服务,在需要session共享的bundle中配置filter即可。
tomcat+httpservlet+session+cookie+jsp+filter
针对多站纯方位目标跟踪与定位问题,给出了一种基于一致性的分布式无迹卡尔曼滤波算法(CDUKF,Consensus-based Dis-tributed Unscented Kalman Filter)。各观测站利用本站和邻接站点信息获得目标状态的局部估计,其次...
struts1.2增删改查分页Filter Session
使用filter验证session用户和页面缓存问题处理
基于Filter的组合查询加分页,内有封装的PageBean,非常好用!初学者可以看看!~
基于jdbc+servlet+filter的网上投票系统 基于jdbc+servlet+filter的网上投票系统 基于jdbc+servlet+filter的网上投票系统 基于jdbc+servlet+filter的网上投票系统 基于jdbc+servlet+filter的网上投票系统 基于jdbc+...
基于Jsp+Tomcat+Filter+Servlet的学生管理系统 基于Jsp+Tomcat+Filter+Servlet的学生管理系统 基于Jsp+Tomcat+Filter+Servlet的学生管理系统 基于Jsp+Tomcat+Filter+Servlet的学生管理系统 基于Jsp+Tomcat+Filter+...
这是一个对session+filter+cookie练习的小项目;使用cookie实现了验证码的点击更换和验证,使用filter防止用户非法登录和使用session实现记住用户名。 此资源在学生资源部分连接了数据库,但在用户的登录验证方面...