技术漫谈Caffenie
FANSEACaffenie
性能超过redis!
Caffeine本地缓存-CSDN博客
java缓存框架Caffeine详解_java caffeine-CSDN博客
使用场景:
1、保存固定不变且经常需要用到的参数
2、读多写少的场景
使用方法
引入依赖
1 2 3 4
| <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency>
|
开启caffeine并且定义缓存
当然也可以设置过期时间,在读多写少的场景下也能保证数据的可靠性
1
| .expireAfterWrite(5,TimeUnit.MINUTES)
|
1 2 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,保证不同参数访问的各自的数据
1 2 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); }
|
手动加载缓存
1 2 3 4 5 6 7 8
| @Bean public Cache<String, Integer> caffeine() { Cache<String, Integer> cache = Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES) .maximumSize(100) .build(); return cache; }
|
自动加载缓存
1 2 3 4 5 6 7 8
| @Bean public LoadingCache<Long, User> caffeine() { LoadingCache<Long, User> cache = Caffeine.newBuilder() .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES) .build(this::loadUser); return cache; }
|
1 2 3 4 5 6 7 8
| @Autowired LoadingCache<Long,User> userCache;
@GetMapping("/{id}") public Result getUser(@PathVariable Long id){ User user = userCache.get(id); return Result.ok(user); }
|
实现接口幂等性
1 2 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, "请勿重复提交"); }
|