Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 060a10e

Browse files
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

Lines changed: 19 additions & 0 deletions
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

Lines changed: 79 additions & 13 deletions
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

Lines changed: 1 addition & 0 deletions
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,

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /