AICon 北京站 Keynote 亮点揭秘,想了解 Agent 智能体来就对了! 了解详情
写点什么

为什么不能用 memcached 存储 Session

  • 2015-01-28
  • 本文字数:1104 字

    阅读完需:约 4 分钟

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

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

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

Memcached 使用“最近最少使用(LRU)”算法回收缓存。但 memcached 的 LRU 算法针对每个 slab 类执行,而不是针对整体

这意味着,如果所有 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 的更多信息,可以查看这里


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015-01-28 00:3914193
用户头像

发布了 1008 篇内容, 共 421.1 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

第十一周 作业2

Yangjing

极客大学架构师训练营

天下武功,唯“拆”不破之MECE原则二| 技术人应知的创新思维模型 (6)

Alan

个体成长 技术人应知的创新思维模型 28天写作

架构师训练营 1 期第 12 周:数据应用(一)- 总结

piercebn

极客大学架构师训练营

Week8作业

lggl

极客时间架构师训练营 1 期 - 第 12 周总结

Kaven

使用 Docker 部署 canal 服务,实现 MySQL 数据库 binlog 日志解析

AlwaysBeta

Python MySQL 数据库 Docker Binlog

极客时间架构师培训 1 期 - 第 12 周作业

Kaven

架構師訓練營 week12 總結

ilake

第十一周 作业1

Yangjing

极客大学架构师训练营

第十二周作业

极客大学架构师训练营

架构师训练营第一期第十二周作业

Leo乐

极客大学架构师训练营

架构师训练营第十二周作业

Shunyi

极客大学架构师训练营

作业-第八周

ray-arch

运维数字化

春如夏花

企业架构 DevOps 数字化运维

架构师训练营第十二周作业

月殇

极客大学架构师训练营

第十二周作业

Meow

week12学习总结

龙卷风

架构师一期

架构师训练营第十二周总结

月殇

极客大学架构师训练营

第十二周作业

fmouse

架构师训练营第 1 期 week12 总结

张建亮

极客大学架构师训练营

如何更简单的使用Polly

八苦-瞿昙

随笔杂谈 aop

week12作业

龙卷风

架构师一期

架构师训练营第 12 周课后练习

叶纪想

极客大学架构师训练营

[架构师训练营第 1 期] 第12周学习总结

猫切切切切切

极客大学架构师训练营

北海游记:日出、日落与海鲜

北风

摄影 游记 大海

第十二周总结

fmouse

组合设计模式实现绘图Pannel

我们新四军不拿群众一针一线

Week8总结

lggl

架构师训练营 1 期 -- 第十二周作业

曾彪彪

极客大学架构师训练营

第十二周学习总结

Meow

Java Parser应用介绍

maijun

为什么不能用memcached存储Session_DevOps & 平台工程_谢丽_InfoQ精选文章