回答

收藏

Memcached 与 Redis?

技术问答 技术问答 293 人阅读 | 0 人回复 | 2023-09-11

我们正在使用带Redis服务器的 Ruby 缓存网络应用程序。有必要测试Memcached吗?
4 D8 ^: a; X$ ~1 i& P, U6 D什么会给我们带来更好的表现?Redis 和 Memcached 有什么优缺点?6 Z, v0 j) m( ]+ @
要考虑的要点:
8 Y+ Y- @8 M  y2 O" F& y& U读写速度。) C9 _3 P; P3 s9 o7 ?- Q$ g
使用内存。
) O- d1 X: s2 q- z6 _  Q$ z磁盘 I/O 转储。
$ `: Q% c) r+ Q5 g' F2 I缩放。
                                                               
5 ?, F  ?; [) ~  P    解决方案:                                                                9 u; a( ]# M" H# ?. O- Y4 W6 m
                                                                Redis 比 memcached 更强大,更受欢迎,更好的支持。Memcached 只能做 Redis 能做的一小部分。即使它们的功能重叠,Redis 也更好。1 {6 I* D/ f( |; f: a1 \3 i
对于任何新事物,请使用 Redis。
, H9 c8 |+ a2 S7 E8 \  q. IMemcached 与 Redis:直接比较这两种工具都是强大而快速的内存数据存储,可用作缓存。两者都可以通过缓存数据库结果HTML 片段或其他可能生成高成本的内容,以帮助加速您的应用程序。
9 T' e! D. |/ y+ i需要考虑的要点当用于同一事物时,以下是如何比较原始问题的要考虑的要点:/ w) L$ k5 X* s
读/写速度:两者都非常快。基准测试因工作负载、版本和许多其他因素而异,但通常表明 redis 与 memcached 一样快或几乎一样快。我推荐 redis,不仅仅是因为 memcached 很慢。
# ]+ g: ^9 k& \# F1 {# T4 R内存使用4 t% j9 [  I7 o9 l8 X
:Redis 更好。" e; k. G3 {. i. i2 k
memcached:当您指定缓存大小时,当您插入项目时,保护过程会比这个大小快速增长一点。除了重新启动 memcached 以外,没有真正的方法可以回收任何空间。您所有的密钥都可能过期,您可以刷新数据库,它仍然使用您配置的完整内存块。2 }+ E2 R, Y+ j* h& W8 f
redis:你决定设置最大尺寸。Redis 永远不要使用超过它必须使用的内存,并将不再使用的内存归还给你。  j6 F" g3 r- f6 @& l1 X; O
我将 100,000 ~2KB 随机句子字符串(~200MB)存储在两者中。Memcached RAM 用量增加到225MB。Redis RAM 用量增加到228MB。刷新两者后,redis 下降到 ~29MB,而 memcached 保持在 ~225MB。它们同样有效地存储数据,但只有一个可以回收数据。' L. W/ @& ?6 u" V8 n/ h
磁盘 I/O 转储:Redis 的明显胜利,因为它默认执行此操作并且具有非常可配置的持久性。Memcached 没有 3rd 方形工具转储到磁盘的机制。
/ c* k/ s4 }' _2 d缩放:在你需要多个例子作为缓存之前,两者都为你提供了很多空间。Redis 包含帮助你超越这些的工具, memcached 则没有。
+ N/ M5 o% R+ q3 \9 l
内存缓存Memcached 是一个简单的易失性缓存服务器。它允许您存储键/值对,其中值限制为最大 1MB 字符串。
; F2 n% C8 n8 ^; G它擅长这一点,但仅此而已。您可以通过他们的键以极高的速度访问这些值,这通常会饱和可用网络甚至内存带宽。
# V  [# h- [9 W. E2 x* y6 ^当您重新启动 memcached 当你的数据消失时。这对缓存有好处。你不应该在那里存储任何重要的东西。
7 [2 e  c. B( n, v1 [2 l如果需要高性能或高可用性,可以 3rd 工具、产品和服务。% |8 x& t& Y- K, q  n
RedisRedis 可完成和 memcached 同样的工作,可以做得更好。) S+ p$ S- j0 s) `! M; l4 p
Redis 也可作为缓存。它还可以存储键/值对。redis它们甚至可以达到 512MB。
/ g/ P. @( x) r1 {您可以关闭持久性,它会在重启时愉快地丢失您的数据。如果你想让你的缓存在重启后继续存在,它也可以让你这样做。事实上,这是默认设置。
: F' p+ F# j- _! _5 |/ t0 a5 w它也很快,通常受到网络或内存带宽的限制。
* C8 g  C4 f4 }# E4 F# ^: F如果 redis/memcached 的例子不足以满足你的工作负荷性能,所以 redis 是明确的选择。Redis 高可用性工具 包括集群支持和开箱即用redis-sentinel )。过去几年,redis 也成了 3rd 方形工具的明显领导者。Redis Labs、Amazon 等公司提供了许多有用的 Redis 工具和服务。redis 周围的生态系统要大得多。现在大规模部署的数量可能比 多memcached 多。* w4 S# n5 ^& \! l
RedisRedis 不仅仅是缓存。它是内存数据结构服务器。您将在下面快速概述 Redis 能做的不仅仅是 memcached 如此简单的键/值缓存。redis 的大部分功能都是 memcached 做不到。
1 M) i; a6 n7 b$ h/ R7 `+ T文档Redis 比 memcached 有更好的文档记录。虽然这可能是主观的,但似乎总是越来越真实。+ l% l" q! z- I9 ?' w' |
redis.io这是一个很好的导航资源。它允许您在浏览器中尝试 redis,甚至为您提供文档中每个命令的实时交互示例。
4 x; Z0 B& P6 X现在 redis 的 stackoverflow 结果是 memcached 2 倍。Google 结果 2 倍。更多语言更容易访问的例子。更积极的发展。更积极的客户开发。这些测量可能没有多大意义,但它们结合起来描绘了一个清晰的图片,即 redis 支持和文档更加丰富及时。3 y9 }' C# K, J) }, S
Persistence默认情况下,redis 使用快照机制将您的数据持续到磁盘。如果你有足够的 RAM,它可以在磁盘上写下所有的数据,几乎不会降低性能。几乎免费!$ u8 Q6 T6 p  b( M
在快照模式下,突然崩溃可能会导致少量数据丢失。如果您绝对需要确保没有数据丢失,请不要担心,redis 也支持 AOF(仅附加文件)模式。在这种持久模式下,数据可以在写入时同步到磁盘。这可以将最大的吞吐量降低到磁盘可以写入的速度,但仍然应该非常快。
+ d- g3 f; m! B7 r1 p; m' L如有必要,有许多配置选项可以微调持久性,但默认值非常合理。这些选项可以很容易地使用 redis 设置为安全冗余的数据存储位置。它是一个真正的数据库。
, F: v& H! p% G1 x$ p许多数据类型Memcached 限于字符串,但 Redis 是一种可以提供多种不同数据类型的数据结构服务器。它还提供了充分利用这些数据类型所需的命令。5 \$ n9 `* h$ S2 @7 [! ]
Strings(命令)大小最大为 512MB 简单文本或二进制值。redis 和 memcached 共享的唯一数据类型,尽管 memcached 字符串限制为 1MB。
' V0 j; N4 K* l: uRedis 通过提供定位操作、定位操作、浮点递增/递减支持、范围查询和多键操作命令,为您提供更多使用此数据类型的工具。Memcached 不支持这些。
' t5 S2 p" @. M; w$ e字符串对各种用例非常有用,即 memcached 对这种数据类型非常有用的原因。
( B0 G6 q* J4 P7 zHashes(命令)哈希有点像键值存储中的键值存储。它们在字符串字段和字符串值之间映射。使用散列的字段->常规字符串中使用的键值映射比->空间效率略高。
/ @0 Z7 \0 ^9 U3 J4 D% x; \6 B  [哈希作为命名空间非常有用,或者当你想在逻辑上分组许多键时。使用散列,可以有效获取所有成员,让所有成员一起过期,删除所有成员。非常适合任何需要分组的用例。2 i, _4 b" O' |, ?, [
用户配置文件存储在应用程序之间。ID 作为密钥存储 redis 哈希将允许您根据需要存储尽可能多的数据位,并将其存储在单个密钥下。使用散列而不是将配置文件序列化为字符串的优点是,您可以让不同的应用程序读取/写入用户配置文件中的不同字段,而不必担心一个应用程序会覆盖其他应用程序的变化(如果您的序列化过时,可能会发生)。7 m4 D) p& y6 e
Lists(命令)Redis 列表是字符串的有序集合。它们优化了插入、读取或删除值,从列表的顶部或底部(也称为左侧或右侧)。: U8 T+ b1 X0 i( ]  @- E3 h4 a
Redis为使用列表提供了许多命令,包括从命令到压入/弹出的项目、推送/列表、截断列表之间的弹出、执行范围查询等
  c5 R8 E: k3 }6 S列表非常持久,原子,队列。这些非常适用于作业队列、日志、缓冲区和许多其他用例。
* ]/ q. o9 H$ m' _' N7 c1 wSets(命令)集合是唯一值的无序集合。经过优化,您可以快速检查一个值是否在集合中,快速添加/删除,并测量与其他集合的重叠。
( I3 p! n! Y- B$ m这些对于访问控制列表、唯一访问者跟踪器和许多其他事物来说非常有用。大多数编程语言都有类似的东西(通常称为 Set)。只有分布式。6 p5 r. T: b, s0 U( m
Redis 提供了几个管理集合的命令。有明显的添加、删除和检查集。不那么明显的命令(如弹出/阅读随机项目)和与其他集合联合和交集的命令也是如此。
. u/ E; T  i  J  Q2 A( x1 _Sorted Sets(命令)排序集也是唯一值的集合。顾名思义,这些都是有序的。它们按分数排序,然后按字典顺序排序。' q% l" E! Y* V; |& K( l
这种数据类型优化了根据分数快速搜索。在两者之间获得最高值、最低值或任何值范围都非常快。
6 k# C+ R6 X$ C如果你把用户和他们的高分添加到排名集中,你将有一个完美的排名列表。当一个新的高分出现时,只要再次将它们添加到集合中,它就会重新安排你的列表。它也非常适合跟踪用户上次访问的时间以及谁在您的应用程序中处于活动状态。$ H" m% G7 h  O8 i2 ]
存储具有相同分数的值会导致它们按字典顺序排列(按字母顺序考虑)。这对自动完成功能非常有用。
. b- u; H! L1 T9 h7 s许多有序的集合命令类似于集合命令,有时有额外的分数参数。它还包括管理分数和查询分数的命令。
2 k- v; B( ?/ ~+ o& {, Y% LGeoRedis存储、检索和测量地理数据有几个命令。这包括半径查询和测量点之间的距离。- A, E* _8 ]: N( U
从技术上讲,redis 中的地理数据存储在排序集中,因此不是真正独立的数据类型。它更像是排序集上的扩展。, J1 J7 M8 O, [
Bitmap和 HyperLogLog与 geo 同样,这些不是完全独立的数据类型。这些命令允许您将字符串数据视为位图或超级日志。
) }+ ^; a" ?' v6 e位图是我在Strings下面引用的位级运算符的用途。这种数据类型是 reddit 最近合作艺术项目的基本构建:r/Place。% {% u& N- ^; V7 E
HyperLogLog 允许您使用极少量的恒定空间,以惊人的精度计算几乎无限的唯一值。只使用大约 16KB,即使以有效地计算你网站上的独立访问者数量,即使数百万。9 J3 Y& H4 G& P: D
事务和原子性redis 中的命令是原子,这意味着你可以确保一旦向 redis 写一个值,所有连接到 redis 客户端是可见的。不需要等待这个值的传播。从技术上讲,memcached 也是原子,但随着 redis 添加除 memcached 以外的所有这些功能,值得注意的是,所有这些额外的数据类型和特性都是原子,这有点令人印象深刻。6 e* ~' R* ^) a1 v
虽然与关系数据库中的事务不同,但 redis 也有使用“乐观锁定”(WATCH / MULTI / EXEC)的事务。
, x' a, _0 O* r5 xPipeliningRedis 提供了一种叫做Pipelining功能。如果你有很多要执行的 redis 命令,你可以用装配线一次发送到 redis,而不是一次一个。) p7 n7 F$ B9 K
通常,当你对 redis 或 memcached 执行命令时,每个命令都是一个单独的请求/响应周期。通过流水线,redis 可以缓冲多个命令并一次执行它们,在一个回复中响应对所有命令的所有响应。
, |5 q7 b  h$ v; P5 {- T# e这可以让你在批量导入或其他涉及大量命令的操作中获得更高的吞吐量。
" A2 S) L8 C) LPub/SubRedis 有专门用于发布/订阅功能的命令,允许 redis 充当高速新闻广播器。这允许单个客户端向许多连接到通道的其他客户端发布信息。1 U% M/ Q3 F' i! Q  s# I: j$ _
Redis 几乎所有工具都可以发布/订阅。RabbitMQ这种特殊的信息代理可能在某些领域有优势,但事实上,同一个服务器还可以为您提供持久的队列和其他可能需要的发布/订阅工作负载的数据结构,Redis 工作通常被证明是最好和最简单的工具。3 r1 L8 j9 H  a# R6 z
Lua 脚本您可以将lua 脚本被为 redis 自己的 SQL 或存储过程。或多或少,但类比大多有效。8 w- m# c4 T# z' V; R
也许你想要 redis 执行的复杂计算。也许你不能让你的事务回滚,你需要确保复杂过程的每一步都会发生原子。通过 可以解决这些问题和更多问题lua 脚本来解决。
8 @$ m, d; v% D1 u' Z整个脚本以原子的形式执行,所以如果你能把逻辑放进 lua 在脚本中,你通常可以避免与乐观锁定事务混淆。9 ^; _# o5 D4 r9 t
缩放如上所述,redis 包括对集群的内置支持,并自称redis-sentinel.4 M$ W2 \" u0 {7 Y) z  R
结论对于任何新项目或尚未使用 memcached 我会毫不犹豫地推荐现有项目 redis 而不是 memcached。: k. T% Y8 @, e7 Z# U
听起来我不喜欢 memcached。相反,它是一种强大、简单、稳定、成熟和硬化的工具。甚至有一些用例比 redis 快一点。我喜欢内存缓存。我只是觉得这对未来的发展意义不大。
# b: L* k7 A7 S" P( k- {& ZRedis 可完成 memcached 通常做得更好。memcached 的任何性能优势都是次要的,特定于工作负荷。还有一些工作负荷 redis 会更快,会更多 redis 可以完成memcached 无法完成的工作负载。面对巨大的功能差距,这两种工具都是如此快速和高效,它们可能是你永远不必担心扩展的最后一部分,所以性能差异似乎很小。- |, l+ ?  C* x, F! J: F
只有一种情况memcached 更有意义:memcached 已被用作缓存。如果您已经使用 memcached如果满足您的需要,请继续使用 缓存。转移到 redis 如果你打算 redis 只用于缓存,可能不能提供足够的好处,值得花时间。memcached 如果你不能满足你的需求,你可能会转向 redis。不管你需要扩展到 memcached 还需要其他功能,这是正确的。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则