forked from coderbruis/JavaSourceCodeLearning
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCaffeineDemo.java
More file actions
131 lines (91 loc) · 2.63 KB
/
Copy pathCaffeineDemo.java
File metadata and controls
131 lines (91 loc) · 2.63 KB
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.learnjava.optimization;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalListener;
import java.math.BigDecimal;
import java.util.concurrent.TimeUnit;
/**
* Caffeine 代码Demo(SpringBoot自带的缓存类)
*
*
* @author lhy
* @date 2021/7/22
*/
public class CaffeineDemo {
private static Cache<String, ProductVo> productVoCache;
public static RemovalListener<String, ProductVo> listener = (k, v, cause) -> {
// 业务逻辑
// 触发异常
switch (cause) {
// 过期
case EXPIRED:
break;
// 手动删除
case EXPLICIT:
break;
// 被替换
case REPLACED:
break;
// 垃圾回收
case COLLECTED:
break;
// 超过数量限制
case SIZE:
break;
default:
break;
}
};
public static void main(String[] args) {
// 初始化
// afterPropertiesSet();
}
/**
* 模拟Spring的类初始化的时候对缓存进行初始化
*/
public static void afterPropertiesSet() {
productVoCache = Caffeine.newBuilder()
.softValues()
.refreshAfterWrite(7200, TimeUnit.SECONDS)
.removalListener(listener)
// .build(k -> loadSync(k))
// 非static类中,可以使用这种方式.build(this::loadSync);
.build(CaffeineDemo::loadSync);
}
/**
* 获取对应缓存内容
* @param key
* @return
*/
public static ProductVo getProductVo(String key) {
return productVoCache.get(key, CaffeineDemo::loadSync);
}
/**
* 对对应商品进行缓存
* @param key
*/
public static void putProductVo(String key) {
productVoCache.put(key, loadSync(key));
}
private static ProductVo loadSync(String key) {
// 业务逻辑
return new ProductVo();
}
public static class ProductVo {
private String productName;
private BigDecimal price;
public ProductVo() {}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
}