命中率:命中数/(命中数+没有命中数)java
1、影响因素算法
2、缓存分类和应用场景spring
3、经常使用组件数据库
Guava Cacheapache
public class GuavaCacheExample1 { public static void main(String[] args) { LoadingCache<String, Integer> cache = CacheBuilder.newBuilder() .maximumSize(10) // 最多存放10个数据 .expireAfterWrite(10, TimeUnit.SECONDS) // 缓存10秒 .recordStats() // 开启记录状态数据功能 .build(new CacheLoader<String, Integer>() { @Override public Integer load(String key) throws Exception { return -1; } }); log.info("{}", cache.getIfPresent("key1")); // null cache.put("key1", 1); log.info("{}", cache.getIfPresent("key1")); // 1 cache.invalidate("key1"); log.info("{}", cache.getIfPresent("key1")); // null try { log.info("{}", cache.get("key2")); // -1 cache.put("key2", 2); log.info("{}", cache.get("key2")); // 2 log.info("{}", cache.size()); // 1 for (int i = 3; i < 13; i++) { cache.put("key" + i, i); } log.info("{}", cache.size()); // 10 log.info("{}", cache.getIfPresent("key2")); // null Thread.sleep(11000); log.info("{}", cache.get("key5")); // -1 log.info("{},{}", cache.stats().hitCount(), cache.stats().missCount()); log.info("{},{}", cache.stats().hitRate(), cache.stats().missRate()); } catch (Exception e) { log.error("cache exception", e); } } }
Memcache编程
Redis缓存
最大元素(空间):缓存大小 服务器
清空策略:FIFO、LFO、LRU、过时时间,随机等网络
FIFO: 先进先出策略mybatis
LFO:最少使用策略
LRU:最近最少使用策略
缓存一致性
形成这种问题的场景:
缓存并发问题
同时大量请求访问缓存未命中,而后大量请求同时访问数据库形成数据库压力增大,解决办法是加锁,避免同时执行
缓存穿透问题
某个查询结果为空,致使缓存为存储,所以大量请求会去查询数据库,形成对数据库的压力大增
解决办法:
一、缓存空对象,缓存时间要短,适合命中率不高,可是须要频繁修改的数据
二、进行单独过滤处理,对全部可能结果为空的请求进行统一存放,而且对请求进行拦截,避免请求到数据库对数据库形成大量压力
缓存雪崩现象
致使缘由:缓存并发,缓存穿透等
解决办法:过时时间设置随机数,避免同时失效10
特性
为何须要消息队列
消息队列的好处
举例
拆分原则
须要考虑的问题
通讯工具
经常使用限流算法
计数器法
滑动窗口法
漏桶算法
令牌桶算法(Guava RateLimit)
@Slf4j public class RateLimiterExample1 { private static RateLimiter rateLimiter = RateLimiter.create(5); public static void main(String[] args) throws Exception { for (int index = 0; index < 100; index++) { if (rateLimiter.tryAcquire(190, TimeUnit.MILLISECONDS)) { handle(index); } } } private static void handle(int i) { log.info("{}", i); } }
@Slf4j public class RateLimiterExample2 { private static RateLimiter rateLimiter = RateLimiter.create(5); public static void main(String[] args) throws Exception { for (int index = 0; index < 100; index++) { rateLimiter.acquire(); handle(index); } } private static void handle(int i) { log.info("{}", i); } }
Guava RateLimiter是单机版的限流
若是是分布式能够采用 分布式限流:
能够采用Redis做为中间组件,使用Redis的incrby key num 方法
服务降级
服务熔断
总结
共性:目的、最终表现、粒度、自治
区别:
服务降级要考虑的问题
Hystrix
数据库瓶颈
数据库切库
自定义注解完成数据库切库-代码实现
数据库支持多个数据源-代码实现
数据库分表