【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

为什么不能用 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:3913817
用户头像

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

关注

评论

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

腾讯云CLS日志服务初体验

三掌柜

5月日更

“三次握手,四次挥手”这么讲,保证你忘不了

三分恶

计算机网络

Rust从0到1-错误处理-panic!还是Result

rust 错误处理 result panic!

这么狠,私塾在线架构师系列课程全都免费发放

InfoQ_d2212957090d

Java

WizTree——一个扫描快似Everything的硬盘空间分析工具

DisonTangor

DevOps windows

☕【JVM技术之旅】你真正掌握了Java对象创建的流程吗?

洛神灬殇

JVM java对象分析 java对象 对象创建 5月日更

mongodb 修改字段类型

xiaolu

mongodb

架构实战营模块四作业

冷大大

作业 架构实战营 模块四

设计千万级学生管理系统的考试试卷存储方案

thewangzl

重命名表,应该怎么做?

Simon

MySQL

懂得取舍才是缓存设计的真谛

万俊峰Kevin

缓存 cache 分布式缓存 Go 语言

云小课|聊一聊DRS的数据过滤特性

华为云开发者联盟

数据库 DRS 数据复制服务 数据过滤 数据库引擎

架构师训练营模块4作业

歲月鎏金😈

python 高级函数补充

若尘

Python编程 高级函数 5月日更

LRU 和 LFU

且听且吟

探索GaussDB(DWS)的过程化SQL语言能力

华为云开发者联盟

数据库 GaussDB(DWS) SQL语言 PLSQL语言 索引表达式

技术干货 | 基于MindSpore更好的理解Focal Loss

华为云开发者联盟

函数 mindspore Focal Loss 样本

身份认证

escray

学习 极客时间 安全 5月日更 安全攻防技能30讲

集成学习案例二 (蒸汽量预测)

容光

架构实战营 模块四课后作业

iProcess

架构实战营

Spring cloud 之熔断机制

Damon

5月日更 熔灾

NumPy之:ndarray中的函数

程序那些事

Python Numpy

聊聊dubbo协议2

捉虫大师

dubbo 协议

【Flutter 专题】122 图解自定义半遮挡头像 SeriesCircleProfile & CircleAvatar

阿策小和尚

5月日更 Flutter 小菜 0 基础学习 Flutter Android 小菜鸟

新思科技为中兴通讯提供BSIMM软件安全评估

InfoQ_434670063458

5G 新思科技 中兴 软件安全 BSIMM

BMP、GIF、TIFF、PNG、JPG和SVG格式图像的特点

不脱发的程序猿

图像格式

架构实战营 模块四作业

Dylan

架构实战营

架构营作业-模块4

大师兄

《Spring 手撸专栏》第 3 章:初显身手,运用设计模式,实现 Bean 的定义、注册、获取

小傅哥

Java spring 设计模式 小傅哥 抽象类

云计算下半场:打法已变,谁主沉浮

ToB行业头条

云计算

网络攻防学习笔记 Day24

穿过生命散发芬芳

5月日更 网络攻防

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