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

quakewang · November 19, 2014 · Last by jeffrey6052 replied at November 24, 2014 · 25831 hits
Topic has been selected as the excellent topic by the admin.

随着 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 Floor has deleted

学习了,非常有用!

Unknow user #19 November 23, 2014

👏

赞,感谢分享

很好的资料。感谢啊。

24 Floor has deleted
25 Floor has deleted
26 Floor has deleted
27 Floor has deleted
28 Floor has deleted
29 Floor has deleted
30 Floor has deleted
31 Floor has deleted

也在用 redis 做缓存

学习了,刚巧要看 redis!

You need to Sign in before reply, if you don't have an account, please Sign up first.