大厂Data+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:3914239
用户头像

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

关注

评论

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

OCR性能优化:从认识BiLSTM网络结构开始

华为云开发者联盟

OCR Seq2Seq BiLSTM 网络结构 OCR网络

350道Android面试真题分享,大厂直通车!

欢喜学安卓

android 程序员 面试 移动开发

520特辑丨码神VS爱神:盘点程序员的四大男友力,你偏爱哪一种?

华为云开发者联盟

程序员 代码 520 男朋友 男友力

视频分割修整功哪一款视频剪辑软件更好用?

奈奈的杂社

短视频 视频剪辑 视频处理 视频制作

Nginx高并发调优中常被忽略的参数

运维研习社

nginx 运维 并发 性能调优 5月日更

商业落地页端到端性能优化实践

百度Geek说

大前端

学习笔记之:知识地图

Nydia

学习

TOB产品需求调研

lenka

5月日更

Rust从0到1-错误处理-Result

rust Error 可恢复错误 result

CEO观点 | 核心开放:企业拥抱开源的成功之道

极狐GitLab

开源 DevOps 安全 高效 协同办公

北京市级预付费资金监管平台正式上线试运行 内嵌区块链存证技术

CECBC

Hibernate的get和load区别学习笔记

风翱

hibernate 5月日更

Python 多线程 VS 多进程(二)

若尘

多线程 多进程 Python编程 5月日更

低代码“骗局”

ES_her0

5月日更

有了这三个神器工具集,应用开发想怎么玩就怎么玩

华为云开发者联盟

开发者 华为云 应用开发 工具集 APIExplorer

网易云课堂 Service Worker 运用与实践

有道技术团队

Service Worker

省钱、省时、省力的音视频通信服务

anyRTC开发者

音视频 WebRTC 云服务 RTC

一文掌握 Java8 的 Optional 的 6 种操作

看山

Java

华云大咖说 | 华云超融合在论文期刊行业的应用实践

华云数据

【LeetCode】前K个高频单词Java题解

Albert

算法 LeetCode 5月日更

Go sync.Pool 浅析

HHFCodeRv

Go 语言

写给丫头

小天同学

情人节 5月日更 520单身福利 情书 告白

211本硕如何通过字节跳动、百度、美团Android面试?复习指南

欢喜学安卓

android 程序员 面试 移动开发

MemVerge认为PB级内存池将随CXL而来

Steven Xu

内存 存储 高性能服务器

面向服务体系结构的领域驱动设计

码语者

DDD

网络攻防学习笔记 Day20

穿过生命散发芬芳

5月日更 网络攻防

初探图像二值化

CagyJ

算法 CV OpenCV 图像处理

《Spring 手撸专栏》第 2 章:小试牛刀(让新手能懂),实现一个简单的Bean容器

小傅哥

Java spring 容器 小傅哥 hashmap

Flutter开发:Warning:CocoaPods minimum required version 1.6.0 or greater not installed…的解决方法

三掌柜

5月日更

iPhone如何拍摄惊人的照片

懒得勤快

PCB天线无线模组如何布局摆放?

不脱发的程序猿

物联网 嵌入式设计 PCB天线无线模组 无线模组布局摆放 PCB产品

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