开源项目 Redis 作为缓存服务器的配置

quakewang · 2014年11月19日 · 最后由 jeffrey6052 回复于 2014年11月24日 · 25822 次阅读
本帖已被管理员设置为精华贴

随着 redis 的发展,越来越多的架构用它取代了 memcached 作为缓存服务器的角色,它有几个很突出的特点:

  1. 除了 Hash,还提供了 Sorted Set, List 等数据结构
  2. 可以持久化到磁盘
  3. 支持 cluster (3.0)

它的性能和 memcached 不相上下,再加上流行的其他组件(比如队列)也会用到 redis,从架构简单出发,已经没有必要混用 redis 和 memcached 了。

写篇短文介绍一下用 redis 作为缓存服务器配置时候需要注意几个点。

Redis 配置

作为缓存服务器,如果不加以限制内存的话,就很有可能出现将整台服务器内存都耗光的情况,可以在 redis 的配置文件里面设置:

# 限定最多使用1.5GB内存
maxmemory 1536mb

如果内存到达了指定的上限,还要往 redis 里面添加更多的缓存内容,需要设置清理内容的策略:

# 设置策略为清理最少使用的key对应的数据
maxmemory-policy allkeys-lru

清理策略有多种,redis 的官方文档有一篇很详细的说明: http://redis.io/topics/lru-cache

Redis 监控

redis 提供了 INFO 这个命令,能够随时监控服务器的状态,只用 telnet 到对应服务器的端口,执行命令即可:

telnet localhost 6379
info

在输出的信息里面有这几项和缓存的状态比较有关系:

keyspace_hits:14414110
keyspace_misses:3228654
used_memory:433264648
expired_keys:1333536
evicted_keys:1547380

通过计算 hits 和 miss,我们可以得到缓存的命中率:14414110 / (14414110 + 3228654) = 81% ,一个缓存失效机制,和过期时间设计良好的系统,命中率可以做到 95% 以上,对于整体性能提升是很大的。 used_memory,expired_keys,evicted_keys 这 3 个信息的具体含义,redis 的官方也有一篇很详细的说明: http://redis.io/commands/info

有个 ruby gem 叫 redis-stat,它利用 INFO 命令展现出更直观的信息报表,推荐: https://github.com/junegunn/redis-stat

优化 Rails 的缓存配置

Rails 在用 redis 作为缓存的时候,配置很简单,官方文档是用 schema 的方式来写的:

config.cache_store = :redis_store, "redis://localhost:6379/0/cache"

由于实在太简单了,很多人就直接用这个默认设置了,但实际上还有一些很有用的参数可以通过 hash options 的方式来写,比如压缩超过 32K 的数据压缩以后再放入缓存,再比如设置默认所有的 key 失效时间为 8 小时:

config.cache_store = :redis_store, {:host => 'redis.server', :port => 6379, :compress => true, :expires_in => 8.hours, :compress_threshold => 32.kilobytes}

用一个实际案例来作为例子,一台 redis 缓存服务器在优化配置之前,占用 4.2G 左右的内存,缓存命中率在 70% 左右。 我们先在服务器上执行 BGSAVE 命令,将内存 dump 下来,然后用 https://github.com/sripathikrishnan/redis-rdb-tools 这个工具,将 dump 的数据,解析成 csv 文件:

rdb -c memory /var/redis/6379/dump.rdb > memory.csv

用 excel 打开分析,按 key 进行排序和统计,我们可以看到哪一些类型的缓存在服务器上最多,调整这个类型缓存的失效时间和失效机制,再通过 redis-stat 来观察进行微调,提高整体的命中率。 通过分析占用内存比较大的 key,发现有 30% 左右的相同类型 key,用了 95% 的内存,这些缓存大部分是 html 的片段缓存,通过设置 compress_threshold 和 compress 参数,让整体内存占用从 4.2G,下降到了 1.3G。

这里的用法和我的用法如出一辙啊,设置最大内存,然后用 lru 算法清除过期的缓存 后面的用来分析的办法很赞,非常感谢 @quakewang

我直接用下面两条命令就可以取到 memory usage 信息和 hits 信息。

redis-cli info memory
redis-cli info stats

在设置 maxmemory 的时候一定要注意可能的 fragmentation ratio,要比你机器的实际内存低一点才可以。因为 maxmemory 不是看 memory rss 的,很有可能你的 memory rss 已经超过了,还是会 crash 的。

http://redis.io/topics/admin 这个对于 redis 的搭建也很有用

还有就是,加个报警很重要

感谢 @quakewang 非常有帮助!

最近项目正在转去 redis,正好用!

介绍的工具不错。

灰常好!

赞!非常不错!!

请问,你们在项目中使用哪个 gem 来实现用 Redis 进行缓存?

16 楼 已删除

学习了,非常有用!

匿名 #19 2014年11月23日

👏

赞,感谢分享

很好的资料。感谢啊。

24 楼 已删除
25 楼 已删除
26 楼 已删除
27 楼 已删除
28 楼 已删除
29 楼 已删除
30 楼 已删除
31 楼 已删除

也在用 redis 做缓存

学习了,刚巧要看 redis!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号