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

quakewang · 发布于 2014年11月19日 · 最后由 jeffrey6052 回复于 2014年11月24日 · 17650 次阅读
162
本帖已被设为精华帖!

随着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。

共收到 24 条回复
328

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

3

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

redis-cli info memory
redis-cli info stats
291

点个赞

533

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

1232

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

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

360

感谢 @quakewang 非常有帮助!

5190

点个赞

5

#7楼 @yangxing_star 赞的挺快呢~ 👏

5190

#8楼 @mimosa 我是点赞达人

14332

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

973

介绍的工具不错.

594

灰常好!

5759

赞!非常不错!!

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

16楼 已删除
9967

学习了,非常有用!

96

赞,感谢分享

96

赞一个

96

很好的资料。感谢啊。

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

也在用redis做缓存

96

学习了,刚巧要看redis!

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