架构选择
组件选择(多级)
- 本地缓存(JVM) 目前首先推荐Caffeine.
- 文件缓存
- 二级缓存(分布式缓存)
本地缓存适用场景
- 性能要求高
- 不经常变化
- 内存占用不大
- 数据实时性要求不高
文件缓存
静态资源缓存,详情见nginx.
分布式缓存
主从+哨兵(sentinel) 或者 redis cluster.
- 做数据库使用,数据完整
- 作缓存使用
配置项
缓存大小
为了均衡效率和资源的矛盾,缓存均应设置大小上限.
caffeine 可通过手动管理设置最大缓存量或者spring中application.yml配置.
nginx 通过配置文件设置.
redis 通过redis-cli配置,或者spring中application.yml配置.
淘汰策略
- all-keys-lru 一般选这个
- volatile-lru 比all-keys-lru性能差,因为需要多存储过期时间
- all-keys-random 希望请求平均分布
- no-evict 当数据库用时
- 自己控制:volatile-ttl
key数量
redis 单例 处理key 250m个
一个key或者val最大为512m
读写峰值
基于内存单进程,单线程.11w+的读qps. 8w的qps写.
命中率
命中率越高,缓存收益越高,应用性能越好(响应时间短,吞吐量高,并发能力强).
info 命令查看监控服务器状态.
影响命中率的因素:
- 缓存对象越多,命中率越高.(查user,保存50个对象,则可能40个人登录都hit)
- 过期时间越长,命中率越高.
- 缓存的数量越少,命中率越高.(缓存一个对象,命中率高于缓存一个元素极多的集合(集合内容越大,变化可能越大,越不容易完全命中))
过期策略
定时删除+惰性删除.详情见 redis详解.md
性能指标监控
同样使用info命令.
connected_clients:68 #连接的客户端数量
used_memory_rss_human:847.62M #系统给redis分配的内存
used_memory_peak_human:794.42M #内存使用的峰值大小
total_connections_received:619104 #服务器已接受的连接请求数量
instantaneous_ops_per_sec:1159 #服务器每秒钟执行的命令数量 qps
instantaneous_input_kbps:55.85 #redis网络入口kps
instantaneous_output_kbps:3553.89 #redis网络出口kps
rejected_connections:0 #因为最大客户端数量限制而被拒绝的连接请求数量
expired_keys:0 #因为过期而被自动删除的数据库键数量
evicted_keys:0 #因为最大内存容量限制而被驱逐(evict)的键数量
keyspace_hits:0 #查找数据库键成功的次数
keyspace_misses:0 #查找数据库键失败的次数
Redis监控平台:
- grafana
- prometheus
- redis_exporter
缓存预热
思路:
- 数据量不大时,应用启动时自动进行加载.
- 定时任务刷新缓存,加载数据库数据到缓存.