技术漫谈Caffenie
FANSEACaffenie
性能超过redis!
Caffeine本地缓存-CSDN博客
java缓存框架Caffeine详解_java caffeine-CSDN博客
使用场景:
1、保存固定不变且经常需要用到的参数
2、读多写少的场景
使用方法
引入依赖
| 12
 3
 4
 
 | <dependency><groupId>com.github.ben-manes.caffeine</groupId>
 <artifactId>caffeine</artifactId>
 </dependency>
 
 | 
开启caffeine并且定义缓存
当然也可以设置过期时间,在读多写少的场景下也能保证数据的可靠性
| 1
 | .expireAfterWrite(5,TimeUnit.MINUTES)
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | @Configuration@EnableCaching
 public class CaffeineConfig {
 @Bean
 public CaffeineCacheManager caffeineCacheManager(){
 CaffeineCacheManager caffeine = new CaffeineCacheManager();
 caffeine.registerCustomCache("productDetails", Caffeine.newBuilder().recordStats().maximumSize(1000).build());
 return caffeine;
 }
 }
 
 | 
使用缓存
他会以参数为key,保证不同参数访问的各自的数据
| 12
 3
 4
 5
 6
 7
 
 | @GetMapping("detail")@Cacheable("productDetails")
 public Result detail(@RequestParam Integer id){
 Products product = productsService.getById(id);
 sleep(1000);
 return Result.ok(product);
 }
 
 | 
手动加载缓存
| 12
 3
 4
 5
 6
 7
 8
 
 | @Beanpublic Cache<String, Integer> caffeine() {
 Cache<String, Integer> cache = Caffeine.newBuilder()
 .expireAfterWrite(1, TimeUnit.MINUTES)
 .maximumSize(100)
 .build();
 return cache;
 }
 
 | 
自动加载缓存
| 12
 3
 4
 5
 6
 7
 8
 
 | @Beanpublic LoadingCache<Long, User> caffeine() {
 LoadingCache<Long, User> cache = Caffeine.newBuilder()
 .maximumSize(10000)
 .expireAfterWrite(10, TimeUnit.MINUTES)
 .build(this::loadUser);
 return cache;
 }
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 
 | @AutowiredLoadingCache<Long,User> userCache;
 
 @GetMapping("/{id}")
 public Result getUser(@PathVariable Long id){
 User user = userCache.get(id);
 return Result.ok(user);
 }
 
 | 
实现接口幂等性
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | @Configuration@EnableCaching
 public class CaffeineConfig {
 @Bean
 public Cache<String, Integer> caffeine() {
 Cache<String, Integer> cache = Caffeine.newBuilder()
 .expireAfterWrite(10, TimeUnit.SECONDS)
 .maximumSize(1000)
 .build();
 return cache;
 }
 }
 
 @Component
 public class CaffeineUtils {
 @Autowired
 Cache<String, Integer> cache;
 
 public static String LOGIN_PREFIX = "login:";
 
 public boolean verifyIdempotent(String key) {
 
 Integer value = cache.getIfPresent(key);
 if (value == null) {
 cache.put(key, 1);
 return false;
 }
 return true;
 }
 }
 
 
 boolean isPresent = caffeineUtils.verifyIdempotent(CaffeineUtils.LOGIN_PREFIX + username);
 if (isPresent) {
 return new AjaxResult(AjaxResult.Type.WARN, "请勿重复提交");
 }
 
 |