现在应该有很多站长们都知道 Memcached 和 Redis 这两个服务器端的缓存扩展了吧?明月早期也折腾了好久了(大部分文章都分享在【明月登楼学习笔记】上了都)。自从明月放弃使用 WordPress 本地缓存插件后,这些服务器缓存扩展也基本都放弃使用了,从本博客的速度上大家可以体会到速度没有多大的影响,甚至你几乎体会不到停用和使用在速度上的差异。
这也说明无论是 Memcached 还是 Redis 实现的优化加速效果,至少对于明月的博客当前的流量来说是比较“鸡肋”的,那怕 Memcached 和 Redis 一直都是服务器端速度优化必选扩展的情况下,没有这些扩展的支持服务器速度和负载依然可以保持在非常平稳和低的水平。今天明月就给大家讲解一下要理智冷静的选择使用 Memcached 或者 Redis,不要盲目跟风。很多时候网站和服务器其实就是需要一个“合适”的状态就可以了,并不是别人用的好你就一定可以用得好的。我们先从 Memcached 和 Redis 的定义上看看它们的共同点:
Memcached 简介
Memcached 是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、hatena、Facebook、Vox、LiveJournal 等众多服务中提高 Web 应用扩展性的重要因素。
Memcached 是一种基于内存的 key-value 存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API 调用或者是页面渲染的结果。
Memcached 简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的 API 兼容大部分流行的开发语言。
本质上,它是一个简洁的 key-value 存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。
Memcached 特征
Memcached 作为高速运行的分布式缓存服务器,具有以下的特点。
- 协议简单
- 基于 libevent 的事件处理
- 内置内存存储方式
- Memcached 不互相通信的分布式
Redis 简介
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis 优势特征
- 性能极高 – Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。
- 丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
- 丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。
Redis 与其他 key-value 存储有什么不同?
Redis 有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis 的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis 运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样 Redis 可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
通过上面的介绍基本上可以判定 Memcached 就是通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用( WordPress 、 Typecho )的速度、提高可扩展性的,而 Redis 看着其实就是 Memcached 升级增强体了对缓存的存储和读写速度相对于 Memcached 来说有了大幅的的提升。总之对于我们 WordPress 站点来说 Memcached 就够用了,Redis 可能在性能上会有一定提升而已。
我们再理智冷静的分析一下就会发现其实 Memcached 对硬件配置的要求更低,Redis 需要足够硬件内存支撑才能更好的发挥出性能提升效果(内存低于 1G 的服务器明月是不建议使用 Redis 的,因为一旦 Redis 对内存有更多需求的时候进程就会被“干掉”,这时候网站访问就会出现“404”了。)对于我们个人博客来说 1G 内存配置算是比较常见的配置了,在 MySQL、Nginx 使用一部分后基本也就没有剩下多少了,勉强的用用 Memcached 还是可以接受的。
那么 Memcached 的使用呢,效果会有多好呢?就明月的经验来看,对于我们个人博客来说效果真的是很不明显的,当然有站长会说使用了 Memcached 后速度提升明显,这个明月认为是一种“假象”而已,站长访问自己网站的频率是很高的,这期间浏览器缓存已经积累了很多,甚至有些站长为了便于调试会本地强制回源访问,这些因素其实都会影响页面的载入速度的,很多时候你的站点访问快不快不是站长自己感觉的,而是要看访问用户的体验的,很多站长们都容易犯这个“灯下黑”的错误。
WordPress 站点使用 Memcached 或者 Redis 都是需要插件配合使用的,而这类插件一般都是缓存插件,在【我为什么放弃了缓存插件?】和【WordPress 博客什么时候才需要缓存插件】文章里明月专门讲到过缓存插件的弊端和什么时候才需要使用缓存插件,用到 Memcached 和 Redis 身上同样的可以的。通俗点说 Memcached 和 Redis 一般都是在服务器硬件已经无法承受或者当前的访问量已经临近服务器能承受的“警戒”阈值的时候才需要用的,也就这时候才能体验到“提速”的效果。当然这必须要有一个大前提那就是你的服务器有足够的内存才可以否则就是“适得其反”的事儿了。
至于说服务器访问量、负载都在正常阈值情况下使用 Memcached 和 Redis 也不是不可以,但会带来稳定性和安全性上两个无法预测的隐患,因为 Linux 特殊的内存机制, Memcached 和 Redis 都会有因内存紧张进程被“干掉”的风险,这个风险是不可控和预测的哦!当然如果你的内存很大可以无视这条了。安全隐患主要就是 Memcached 和 Redis 自身的漏洞造成, Memcached 的默认端口 11211 就曾经爆过很严重的漏洞,使用阿里云 ECS 的应该当时都收到过相应的通知了吧!Redis 自然也有这个安全风险的,明月就曾经碰到因为漏洞招来攻击造成被阿里云“黑洞”了近一天的时间(啥是“黑洞”?大家自行百度脑补吧!),这期间服务器完全被“封禁”。
还有一种情况就是在使用 CDN 后,原服务器上用着 Memcached 或者 Redis,这更加是非常鸡肋的了,因为在使用了 CDN 后访客基本已经不会访问回源了都在 CDN 节点就可以了,回源访问的都是 CDN 各个节点缓存的时候需要的,服务器的负载和流量请求都维持在一个非常小的阈值上,这时候 Memcached 或者 Redis 的存在除了“招蜂引蝶”以外,明月实在没有看出还有啥作用?要知道现在针对 Memcached 、Redis 端口漏洞的扫描器可是很多的,大家当然不怕“贼偷”了,但“被贼惦记”这绝对不是个好事儿, Memcached 或者 Redis 就是个很好的“被贼惦记”的入口。