一、jvm 堆内存大小 (减少full gc)
二、静态资源分离
将静态资源数据加载至nginx或者其他服务提升系统吞吐量
三、数据库索引,减少读写io次数 统一查询处理
四、缓存
本地缓存(缓存不一致)
设计一个本地内存需要有什么功能
存储;并可以读、写;
原子操作(线程安全),如ConcurrentHashMap
可以设置缓存的最大限制;
超过最大限制有对应淘汰策略,如LRU、LFU
过期时间淘汰,如定时、懒式、定期;
持久化
统计监控
缺点:使用本地缓存如果存在多台服务器会使每台服务器都需要缓存,而且需要保证并发安全需要加锁,这样导致每台服务器都得进行一次抢占操作影响速度
redis缓存:
分布式锁和同步器 · redisson/redisson Wiki · GitHub
springboot2.0以后默认lettuce作为操作redis的客户端,它使用netty进行网络通信
lettuce的bug导致netty推外内存溢出
1>使用jedis 2>升级lettuce
缓存穿透:空结果缓存
缓存雪崩 :设置过期时间(进行随机过期)
缓存击穿:加锁
锁:
本地锁 :JUC
分布式锁: Redis中间锁
Redis锁:可重入锁、读写锁、信号量, 闭锁
缓存一致性:
双写模式:数据发生改变的话,删除缓存重新写入缓存
失效模式:数据发生改变,直接删除缓存 等待下一次查询缓存在写入
解决方案:
1.加过期时间,保存读多写少的数据,处理并发可以加读写锁
2.canal:模拟mysql从表使用binlog日志记录实时监控更新redis,数据异构
总结:都会出现脏数据
SpringCache
@Cacheable: 触发保存缓存数据.
@CacheEvict: 触发删除缓存数据.
@CachePut: 更新缓存数据.
@Caching: 重新组合缓存.
@CacheConfig: 在类级别共享一些与缓存相关的常见设置.
网友评论