Skip to content

Commit 060a10e

Browse files
committedJan 5, 2023
Java:MultiDataSource 新增 Redis 缓存
1 parent 6208b75 commit 060a10e

File tree

3 files changed

+99
-13
lines changed

3 files changed

+99
-13
lines changed
 

‎APIJSON-Java-Server/APIJSONBoot-MultiDataSource/pom.xml

+19
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1616
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
1717
<java.version>1.8</java.version>
18+
<version>2.5.13</version>
1819
</properties>
1920

2021
<dependencies>
@@ -142,6 +143,24 @@
142143
<version>1.2.9</version>
143144
</dependency>
144145

146+
<dependency>
147+
<groupId>redis.clients</groupId>
148+
<artifactId>jedis</artifactId>
149+
<version>3.9.0</version>
150+
</dependency>
151+
152+
<dependency>
153+
<groupId>org.springframework.data</groupId>
154+
<artifactId>spring-data-redis</artifactId>
155+
<version>2.4.0</version>
156+
<exclusions>
157+
<exclusion>
158+
<groupId>redis.clients</groupId>
159+
<artifactId>jedis</artifactId>
160+
</exclusion>
161+
</exclusions>
162+
</dependency>
163+
145164
</dependencies>
146165

147166
<build>

‎APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/java/apijson/demo/DemoSQLExecutor.java

+79-13
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,35 @@
1414

1515
package apijson.demo;
1616

17+
import apijson.JSON;
18+
import apijson.RequestMethod;
1719
import com.alibaba.druid.pool.DruidDataSource;
20+
import com.alibaba.fastjson.JSONObject;
21+
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
1822
import com.vesoft.nebula.jdbc.impl.NebulaDriver;
1923
import com.zaxxer.hikari.HikariDataSource;
2024

25+
import java.io.Serializable;
2126
import java.sql.Connection;
22-
import java.sql.DriverManager;
27+
import java.util.List;
2328
import java.util.Map;
2429
import java.util.Properties;
30+
import java.util.concurrent.TimeUnit;
2531

2632
import javax.sql.DataSource;
2733

2834
import apijson.Log;
2935
import apijson.boot.DemoApplication;
3036
import apijson.framework.APIJSONSQLExecutor;
3137
import apijson.orm.SQLConfig;
38+
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
39+
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
40+
import org.springframework.data.redis.core.RedisTemplate;
41+
import org.springframework.data.redis.serializer.GenericToStringSerializer;
42+
import org.springframework.data.redis.serializer.StringRedisSerializer;
43+
44+
import static apijson.framework.APIJSONConstant.PRIVACY_;
45+
import static apijson.framework.APIJSONConstant.USER_;
3246

3347

3448
/**SQL 执行器,支持连接池及多数据源
@@ -38,19 +52,71 @@
3852
public class DemoSQLExecutor extends APIJSONSQLExecutor {
3953
public static final String TAG = "DemoSQLExecutor";
4054

55+
// Redis 缓存 <<<<<<<<<<<<<<<<<<<<<<<
56+
public static final RedisTemplate<String, String> REDIS_TEMPLATE;
57+
static {
58+
REDIS_TEMPLATE = new RedisTemplate<>();
59+
REDIS_TEMPLATE.setConnectionFactory(new JedisConnectionFactory(new RedisStandaloneConfiguration("127.0.0.1", 6379)));
60+
REDIS_TEMPLATE.setKeySerializer(new StringRedisSerializer());
61+
REDIS_TEMPLATE.setHashValueSerializer(new GenericToStringSerializer<>(Serializable.class));
62+
REDIS_TEMPLATE.setValueSerializer(new GenericToStringSerializer<>(Serializable.class));
63+
// REDIS_TEMPLATE.setValueSerializer(new FastJsonRedisSerializer<List<JSONObject>>(List.class));
64+
REDIS_TEMPLATE.afterPropertiesSet();
65+
}
66+
4167
// 可重写以下方法,支持 Redis 等单机全局缓存或分布式缓存
42-
// @Override
43-
// public List<JSONObject> getCache(String sql, int type) {
44-
// return super.getCache(sql, type);
45-
// }
46-
// @Override
47-
// public synchronized void putCache(String sql, List<JSONObject> list, int type) {
48-
// super.putCache(sql, list, type);
49-
// }
50-
// @Override
51-
// public synchronized void removeCache(String sql, int type) {
52-
// super.removeCache(sql, type);
53-
// }
68+
@Override
69+
public List<JSONObject> getCache(String sql, SQLConfig config) {
70+
List<JSONObject> list = super.getCache(sql, config);
71+
if (list == null) {
72+
list = JSON.parseArray(REDIS_TEMPLATE.opsForValue().get(sql), JSONObject.class);
73+
}
74+
return list;
75+
}
76+
@Override
77+
public synchronized void putCache(String sql, List<JSONObject> list, SQLConfig config) {
78+
super.putCache(sql, list, config);
79+
if (config != null && config.isMain()) {
80+
if (config.isExplain() || RequestMethod.isHeadMethod(config.getMethod(), true)) {
81+
REDIS_TEMPLATE.opsForValue().set(sql, JSON.toJSONString(list), 10*60, TimeUnit.SECONDS);
82+
} else {
83+
String table = config.getTable();
84+
REDIS_TEMPLATE.opsForValue().set(sql, JSON.toJSONString(list), USER_.equals(table) || PRIVACY_.equals(table) ? 10*60 : 60, TimeUnit.SECONDS);
85+
}
86+
}
87+
}
88+
@Override
89+
public synchronized void removeCache(String sql, SQLConfig config) {
90+
super.removeCache(sql, config);
91+
if (config.getMethod() == RequestMethod.DELETE) { // 避免缓存击穿
92+
REDIS_TEMPLATE.expire(sql, 60, TimeUnit.SECONDS);
93+
} else {
94+
REDIS_TEMPLATE.delete(sql);
95+
}
96+
}
97+
98+
@Override
99+
public JSONObject execute(SQLConfig config, boolean unknownType) throws Exception {
100+
JSONObject result = super.execute(config, unknownType);
101+
RequestMethod method = config.getMethod();
102+
if (method == RequestMethod.POST) { // 没必要,直接查就行了
103+
// Object id = result.get(config.getIdKey());
104+
// Object idIn = result.get(config.getIdKey() + "[]");
105+
// SQLConfig cacheConfig = APIJSONRouterApplication.DEFAULT_APIJSON_CREATOR.createSQLConfig();
106+
// cacheConfig.setMethod(RequestMethod.GET);
107+
//
108+
}
109+
else if (method == RequestMethod.PUT || method == RequestMethod.DELETE) { // RequestMethod.isQueryMethod(method) == false) {
110+
config.setMethod(RequestMethod.GET);
111+
boolean isPrepared = config.isPrepared();
112+
removeCache(config.getSQL(false), config);
113+
config.setPrepared(isPrepared);
114+
config.setMethod(method);
115+
}
116+
return result;
117+
}
118+
119+
// Redis 缓存 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
54120

55121
// 适配连接池,如果这里能拿到连接池的有效 Connection,则 SQLConfig 不需要配置 dbVersion, dbUri, dbAccount, dbPassword
56122
@Override

‎APIJSON-Java-Server/APIJSONBoot-MultiDataSource/src/main/resources/static/js/main.js

+1
Original file line numberDiff line numberDiff line change
@@ -3592,6 +3592,7 @@
35923592
'[]': {
35933593
'count': this.testCaseCount || 100, //200 条测试直接卡死 0,
35943594
'page': this.testCasePage || 0,
3595+
'join': '@/TestRecord,@/Script:pre,@/Script:post',
35953596
'Document': {
35963597
'@order': 'version-,date-',
35973598
'userId': this.User.id,

2 commit comments

Comments
 (2)

TommyLemon commented on Jan 5, 2023

@TommyLemon
MemberAuthor

TommyLemon commented on Jan 6, 2023

@TommyLemon
MemberAuthor

已完成

Please sign in to comment.