其他
缓存之王Caffeine Cache,性能比Guava更强,命中率更高!
二、PK Guava
2.1 功能
2.2 性能
2.3 命中率
2.3.1 LRU
2.3.2 LFU
2.3.3 TinyLFU
2.3.4 W-TinyLFU
三、最佳实践
3.1 实践1
maxSize
、refreshAfterWrite
,不设置 expireAfterWrite
refreshAfterWrite
后,触发缓存异步刷新,此时会获取缓存中的旧值缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 可以接受任何时间缓存中存在旧数据
maxSize
、refreshAfterWrite
,不设置 expireAfterWrite
3.2 实践2
maxSize
、expireAfterWrite
,不设置 refreshAfterWrite
expireAfterWrite
后,针对该 key,获取到锁的线程会同步执行 load,其他未获得锁的线程会阻塞等待,获取锁线程执行延时过长会导致其他线程阻塞时间过长缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 不可以接受缓存中存在旧数据 同步加载数据延迟小(使用 redis 等)
maxSize
、expireAfterWrite
,不设置refreshAfterWrite
3.3 实践3
maxSize
,不设置 refreshAfterWrite
、expireAfterWrite
,定时任务异步刷新数据缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 不可以接受缓存中存在旧数据 同步加载数据延迟可能会很大
refreshAfterWrite
、expireAfterWrite
,定时任务异步刷新数据3.4 实践4
maxSize
、refreshAfterWrite
、expireAfterWrite
,refreshAfterWrite
< expireAfterWrite
get 缓存间隔在 refreshAfterWrite
和expireAfterWrite
之间,触发缓存异步刷新,此时会获取缓存中的旧值get 缓存间隔大于 expireAfterWrite
,针对该 key,获取到锁的线程会同步执行 load,其他未获得锁的线程会阻塞等待,获取锁线程执行延时过长会导致其他线程阻塞时间过长
缓存数据量大,限制缓存占用的内存容量 缓存值会变,需要刷新缓存 可以接受有限时间缓存中存在旧数据 同步加载数据延迟小(使用 redis 等)
maxSize
、refreshAfterWrite
、expireAfterWrite
四、迁移指南
4.1 切换至 Caffeine
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
CacheBuilder.newBuilder()
改成 Caffeine.newBuilder()
即可。4.2 Get Exception
get()
方法时,当缓存的 load()
方法返回 null
时,会抛出 ExecutionException
。切换到 Caffeine 后,get()
方法不会抛出异常,但允许返回为 null
。getUnchecked()
方法,它不需要我们显示的去捕捉异常,但是一旦 load()
方法返回 null
时,就会抛出 UncheckedExecutionException
。切换到 Caffeine 后,不再提供 getUnchecked()
方法,因此需要做好判空处理。近期技术热文
1、给IDEA换个酷炫的主题,这有点,惊艳啊!
2、卧槽!这个命令居然会导致Redis长时间阻塞!
3、IDEA 神器,那些让人爱不释手的提效小技巧!
4、翻车了!用了Arrays.asList、ArrayList的subList
第3版:互联网大厂面试题
包括 Java 集合、JVM、多线程、并发编程、设计模式、算法调优、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!
阅读原文: 高清 7701页大厂面试题 PDF