写点什么

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

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

关注

评论

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

中小型城市商业银行数字化转型实践(二)集成关系ESB APIGateway ServiceMesh

泡菜小仙

架构设计 集成架构 ESB

linux文件系统-inode学习整理

戈坞昂

Linux inode

关于键盘的一些事

BabyKing

vim 缓存 键盘 快捷键 karabiner

回“疫”录(21):你这样做的样子真丑

小天同学

疫情 心理 回忆录 现实纪录 纪实

SQL 生成斐波那契数列

zero

sql 斐波那契 MySQ

520 我用算法帮女朋友的闺蜜选男友

cherubines

Python 算法 数据分析 蒙特卡洛 最优解

如何设计一款“高可用高性能”的发号器?

捉虫大师

Java 高可用 发号器 高性能 raft

「Postman教程 」接口测试-2

Megatron7

测试 Postman

你的c++团队还在禁用异常处理吗?

泰伦卢

c c++ C#

中小型城市商业银行数字化转型实践(一)整体技术架构转型(双态IT)

泡菜小仙

数字化转型 架构设计 技术架构

MyBatis支持的jdbcType 枚举类型

Kevin Liao

「Postman教程 」功能介绍-1

Megatron7

测试 Postman

Oracle 数据恢复一例

wong

oracle windows dbf

在Gitlab-ce的Docker中使用自定义端口

天飞

Docker gitlab

生活就是这么讽刺,有时候你嘲笑他,有时候你想成为他......

代码诗人

中年危机 文艺 短片小说

Kubernetes时代的云容器平台:各家云产品模式逐渐丰富

韩超

腾讯云 阿里云 Kubernetes IaaS PaaS

Android | Tangram动态页面之路(四)vlayout原理

哈利迪

android

看完这篇 HTTPS,和面试官扯皮就没问题了

苹果看辽宁体育

https

我的读书笔记-樊登读书法

lmymirror

学习 读书笔记 方法论 读书方式

部门最漂亮的妹子离职了

Geek_6rptuk

团队管理 生涯规划 企业文化 职场

奇怪知识点系列:Office 365 CDN 揭秘

手艺人杨柳

Office 365 Microsoft 365 SharePoint Online

实现一个比LongAdder更高性能的计数器有多难?

捉虫大师

Java jdk LongAdder

2020年5月19日 Java并发编程专题

瑞克与莫迪

Java

比特币是新生事物吗?

Haiyung

比特币

从Deepl说起,聊一聊未来的“安全职业”

孤岛旭日

程序员 AI 职业

程序员的晚餐 | 5 月 19 日 蒜香鸡腿,味道令人惊讶

清远

美食

MacOS 下使用VSCode进行GoLang Test报错

北纬32°

macos vscode Unit Test debug Go 语言

中小型城市商业银行数字化转型实践(三)数据中台建设思路和路径

泡菜小仙

数据中台 数字化转型 数据架构

看得懂的区块链及智能合约概念

石君

区块链 智能合约

谁能让你安稳

Neco.W

工作 稳定性 努力工作

《零基础学 Java》 FAQ 之 9-Java里的各种数据类型占用多少内存空间

臧萌

Java

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