Memcached存Session数据、访问安全性、使用场景总结

最近做了一个单点登录SSO,登陆后的凭证放到Memcached令牌放到Cookies;但是用户经常掉线,开发环境和测试却没有这个问题,最后从Memcached找到原因。

Memcached概念、作用、运行原理、特性、不足简单梳理(1)

Memcached下载安装、NET对Memcached进行CRUD操作(2)

Memcached存Session数据、访问安全性、使用场景总结(3)

一、Session数据放入到Memcached?

Memcached创建者Dormando写过两篇文章:

Sessions in Memcached

Cache your sessions. Don't piss off your users

第一篇文章中指出:如果用memcached存储Session,那么当memcached集群发生故障(比如内存溢出)或者维护(比如升级、增加或减少服务器)时,用户会无法登录,或者被踢掉线。

第二篇文章中指出:Memcached的回收机制可能会导致用户无缘无故地掉线。

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

Memcached for Dummies

Memcached使用“最近最少使用(LRU)”算法回收缓存。但memcached的LRU算法针对每个slab类执行,而不是针对整体。这意味着,如果所有Session的大小大致相同,那么它们会分成两三个slab类。所有其它大小大致相同的数据也会放入同一些slab,与Session争用存储空间。一旦slab满了,即使更大的slab中还有空间,数据也会被回收, 而不是放入更大的slab中……在特定的slab中,Session最老的用户将会掉线。用户将会开始随机掉线,而最糟糕的是,你很可能甚至都不会注意到它,直至用户开始抱怨……

可以看来Memcached是一个设计用于缓存数据而不是存储数据的系统,因此不应该用于存储Session。

建议开发人员不要用memcached存储Session。

 

二、什么样的数据适合放Memcached

不适合的情况:

1.如果是一个小网站,pv值不大,不考虑Memcached

2.变化频繁, 一变化就要入库(股票,金融),不考虑Memcached

3.过大的数据不能放入到Memcached

4.缓存对象的大小大于1MB 

5.key的长度大于250字符

 

适合的情况:

1.变化频繁,查询频繁,但是不一定写入数据库(比如用户在线状态、在线人数..适合Memcached)

2.变化不频繁,查询频繁,不管入不入库,都比较适合Memcached。


 三.Memcached的内存算法:(本文出自 “系统网络运维” 博客,请务必保留此出处http://369369.blog.51cto.com/319630/833234)

    Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。
    传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。

Memcached的缓存策略:
    Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。

Memcached的分布式算法:
    当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。

分布式算法(Consistent Hashing):

    选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
余数算法:
    先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
散列算法:
    先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。

四、Memcached访问安全性

Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运 行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。

内网访问:最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们 Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。

防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。


五、总结

到这里我想你对memcached也有了些了解。

Memcached不是一个数据库,不是存储数据的系统,他只是内存缓存数据系统。

Memcached不是信息的唯一来源,是来辅助数据库操作的,来提升信息的查询速度。

Memcached是key-value存储,所以key约定和命名规范很重要,方便以后进行维护。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值