博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么不能用memcached存储Session?
阅读量:6910 次
发布时间:2019-06-27

本文共 1133 字,大约阅读时间需要 3 分钟。

为什么不能用memcached存储Session

Memcached创建者Dormando很早就写过两篇文章, 告诫开发人员不要用memcached存储Session。他在第一篇文章中给出的理由大致是说,如果用memcached存储Session,那么当 memcached集群发生故障(比如内存溢出)或者维护(比如升级、增加或减少服务器)时,用户会无法登录,或者被踢掉线。而在第二篇文章中,他则指 出,memcached的回收机制可能会导致用户无缘无故地掉线。

 

是DevOps咨询服务提供商。由于看到Ruby/Rails社区忽略了Dormando那两篇文章所指出的问题,所以他近日对此进行了进一步的阐述。他认为问题的根本在于,memcached是一个设计用于缓存数据而不是存储数据的系统,因此不应该用于存储Session。

 

对于Dormando的那两篇文章,他认为第一篇文章给出的原因很容易理解,而人们经常会对第二篇文章给出的原因认识不足。因此他对这个原因进行了详细地阐述:

 

Memcached使用“最近最少使用(LRU)”算法回收缓存。但。

这意味着,如果所有Session的大小大致相同,那么它们会分成两三个slab类。所有其它大小大致相同的数据也会放入同一些slab,与 Session争用存储空间。一旦slab满了,即使更大的slab中还有空间,数据也会被回收,而不是放入更大的slab中……在特定的slab 中,Session最老的用户将会掉线。用户将会开始随机掉线,而最糟糕的是,你很可能甚至都不会注意到它,直至用户开始抱怨……

 

另外,Norkūnas提到,如果Session中增加了新数据,那么Session变大也可能会导致掉线问题出现。

 

有人提出将Session和其它数据分别使用单独的memcached缓存。不过,由于memcached的LRU算法是局部的,那种方式不仅导致内存使用率不高,而且也无法消除用户因为Session回收而出现随机掉线的风险。

 

如果读者非常希望借助memcached提高Session读取速度,那么可以借鉴Norkūnas提出的memcached+RDBMS(在有些情况下,NoSQL也可以)的模式:

  • 当用户登录时,将Session “set”到memcached,并写入数据库;

  • 在Session中增加一个字段,标识Session最后写入数据库的时间;

  • 每个页面加载的时候,优先从memcached读取Session,其次从数据库读取;

  • 每加载N页或者Y分钟后,再次将Session写入数据库;

  • 从数据库中获取过期Session,优先从memcached中获取最新数据。

 

关于memcached的更多信息,可以查看。

转载地址:http://dsycl.baihongyu.com/

你可能感兴趣的文章
java中String的常用方法
查看>>
Bootstrap3实现的响应式幻灯滑动效果个人作品集/博客网站模板
查看>>
C#放缩、截取、合并图片并生成高质量新图的类
查看>>
让所有的浏览器都支持html5
查看>>
朴素贝叶斯分类器的应用
查看>>
openstack笔记
查看>>
How to Kill All Processes That Have Open Connection in a SQL Server Database[关闭数据库链接 最佳方法] -摘自网络...
查看>>
HDU1003 Max Sum(求最大字段和)
查看>>
cocos2dx A*算法
查看>>
Trapping Messages Sent to an Application
查看>>
【JQuery插件】元素根据滚动条位置自定义吸顶效果
查看>>
编程之路
查看>>
Myeclipse7.5 下载 安装 注冊 注冊码 100%成功
查看>>
Java拾遗(一):浅析Java子类和父类的实例化顺序 及 陷阱
查看>>
Windows网络编程
查看>>
混沌分形之朱利亚集(JuliaSet)
查看>>
读书心得:思考·后半本
查看>>
CreateFileMapping使用方法
查看>>
Android中Broadcast Receiver组件具体解释
查看>>
[转载]SQL Server的聚集索引和非聚集索引
查看>>