1、容量规划
- 缓存内容的大小(缓存的数据不易过大,尤其是redis,单线程模式,数据过大容易阻塞其他处理请求)
- 缓存内容的数量
- 淘汰策略
- 缓存的数据结构
- 每秒的读峰值
- 每秒的写峰值
2、性能优化
- 线程模型
- 预热方法
- 缓存分片
- 冷热数据的比例
3、高可用
- 复制模型
- 失效转移
- 持久策略
- 缓存重建
4、缓存监控
- 缓存服务监控
- 缓存容量监控
- 缓存请求监控
- 缓存响应时间监控
5、注意事项
- 是否可能发生缓存穿透 ( 缓存穿透:使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要穿透到后端数据库系统进行查询,使数据库压力过大)
- 对于高并发的缓存使用,需要对无效的key进行缓存,以抵挡恶意或者无意的对无效缓存查询的攻击或者影响。
- 是否有大对象
- 是否使用缓存实现分布式锁
- 是否使用缓存支持的脚本LUA
- 是否避免了 race condition
- 任何缓存的key都必须设置缓存失效时间,且失效时间不能集中在某一个时间点上,需要对key的过期时间进行随机设置,否则会导致缓存沾满内存或者缓存雪崩。
- 对于存储较多value的key,尽量不要使用HGETALL等集合操作,该操作会造成阻塞影响其他应用的访问
- 使用本地缓存(如ehcache)时,一定要严格控制缓存对象的数量和生命周期,由于JVM的特性,过多的缓存对象会极大的影响JVM的性能,甚至导致内存溢出。
- 使用缓存时,一定要有降级处理!尤其是针对关键业务,缓存有问题或者失效时也要能回溯到数据库进行处理
- 在使用远程缓存(如redist,memcached)时,一定要对操作超时时间进行设置,希望是100毫秒以内。