HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

Elasticsearch 核心概念

escray

elasticsearch elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

自动驾驶到底应该怎么实现?(28天写作 Day4/28)

mtfelix

自动驾驶 28天写作 智能电动车

kafka如何做到无消息丢失配置

topsion

kafka 消息不丢失

基于网络开放可编程技术构建新一代网络设备运管平台

华为云开发者联盟

运维 网络 运维自动化 金融

HDFS SHELL详解(5)

罗小龙

hadoop 28天写作 hdfs shell

作为社畜,如何做好精力管理

熊斌

精力管理 28天写作

【薪火计划】11 - 学习总结

AR7

管理 28天写作

影响DevOps和DevSecOps采用的7种趋势

啸天

安全 DevSecOps 应用安全

hive JOIN操作分析

梧桐

生产环境全链路压测建设历程 27:FAQ 之 业务模型相关

数列科技杨德华

28天写作

28天瞎写的第二百一五天:为了看片儿折腾 Linux 的故事

树上

28天写作

为什么泡泡玛特是一个好生意

lidaobing

28天写作 泡泡玛特

微服务该如何拆分?

xcbeyond

微服务 方法论 架构设计原则 28天写作

三分钟快速详细安装CentOS

程序员的时光

Linux centos 程序员 28天写作

SpringCloud 从入门到精通 06--- Eureka服务端

Felix

【JS】防止浏览器控制台被直接查看(2)

德育处主任

JavaScript chrome 大前端 js 28天写作

技术干货!HDFS读写原理和代码简单实现

华为云开发者联盟

hadoop hdfs 架构 MRS 元数据

距离Java开发者玩转 Serverless,到底还有多远?

博文视点Broadview

在时间的缝隙里打了个盹「幻想短篇 4/28」

道伟

28天写作

【Mysql-InnoDB 系列】锁

程序员架构进阶

MySQL innodb 28天写作

技术人小故事-团队愿景篇-第4段

Ian哥

28天写作

新官上任,如何开始你的管理工作(下)

一笑

团队管理 管理 28天写作

没有调查,就没有发言权 Jan 12, 2021

王泰

28天写作

外行话之什么是好的游戏角色

Justin

28天写作 外行话 游戏设计

关于选择的复盘(part 1)

.

28天写作

[2/28]保障业务转化为开发需求

L3C老司机

甲方日常 83

句子

工作 随笔杂谈 日常

我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?

冰河

分布式 微服务 dubbo 系统架构 服务治理

SpringCloud 从入门到精通 07--- 订单服务和支付服务注册进Eureka

Felix

28 天带你玩转 Kubernetes-- 第四天(资源介绍)

Java全栈封神

Kubernetes k8s 28天写作 k8s教程 k8s资源

做视频最大的困难是什么?为什么要保持日更? | 视频号 28 天 (05)

赵新龙

28天写作

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