笔者工作中处理过包括视频、图片和业务元数据在内的cache处理,也遇到了一些实实在在的很常见的坑,还有一些线上处理经验。
缓存使用遇到的坑
- 当需要更新数据时,须优先更新数据源,再更新cache。否则先del cache可能会造成,此时读请求cache miss后读到脏数据。
- 使用redis的INCR、SADD、HSET、zadd等操作前,须先expire判断该key是否存在。否则可能会因为key过期导致错误的value。
- 如果存图片或小视频等数据,比如大于100k的value,redis的性能是下降比较厉害的,优先存memcache。再大一些的比如1M以上的,建议放其他的缓存系统,比如couchbase、groupcache等。
一些经验
- cache节点的部署,尽量跨机器,多节点。可以避免cache节点挂掉而导致回源对db的冲击。另一方面也能避免个别key过热而影响整体业务。
- cache的监控,除了日常的资源监控,还要包括命中率、会不会有过热的key等。特别热门的大key要做冗余存储。
- 特别重要的数据同时量不是特别巨大,可以做localcache,比如放到内存里。可以保证系统更高的可用性。