Redis使用中需要注意的一些点

缓存过期策略

Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。

是否需要redis的持久化能力?

redis持久化的是数据集的当前快照,于是当你用它来做存储,而不是缓存时,就会很纠结。
当数据集很大的时候,比如64G内存,数据集30G,你愿意dump快照或者aof收缩吗?如果这样做,问题就来了,redis的dump是fork一个进程,利用操作系统内存管理的copy-on-write来得到当前内存快照,但如果数据的更新比较频繁,30G内存dump到磁盘的速度又不快,就会导致在dump的时候需要大量的内存来做写时copy,需要的新内存加上原有的30G内存,可能导致操作系统swap,同时因为copy-on-write,主线程在处理请求时也会变慢,redis的整体性能急速下降。所以大数据集把redis当做cache,只有当数据集很小的时候,才用它来做持久存储。

内存碎片

因为redis的malloc方式,导致一个潜在问题,就是当有很多small object放进去,又被频繁的free后,导致了大量的内存碎片,到一定临界点后,你会发现插入新数据的时候redis的性能急剧下降,原因在malloc函数上要花很长时间。

使用场景

Redis的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个网站有1亿注册用户,如果这些资料要用Redis来存储,内存的容量必须能够容纳这1亿用户。但是业务实际情况是1亿用户只有1000万活跃用户,1周来访问过1次的也只有1500万用户,因此全部1亿用户的数据都放在内存有不合理之处,RAM需要为冷数据买单。

Redis最首要的实用场景:少量数据存储,高速读写需求。此类应用过程数据全部in-momery 的格式来提供高速读写,同时提供数据持久化的功能。

一些经验教训:

  1. 使用 Redis 之前,做好容量规划,对数据的使用方式做好规划;
  2. 使用 Redis 的过程中,经常关注内存使用,做好监控报警;
  3. 谨慎选择持久化方案,对可能造成的高延迟要有心理准备;
  4. 小心Redis的内存碎片。