Skip to content

Commit cc98b19

Browse files
author
gituser
committed
Merge branch 'hotfix_1.8_3.9.x_23318' into 1.8_release_3.9.x
2 parents 17e341e + c15fcac commit cc98b19

File tree

4 files changed

+154
-140
lines changed

4 files changed

+154
-140
lines changed

docs/redisSide.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
CREATE TABLE tableName(
55
colName cloType,
66
...
7+
PRIMARY KEY(colName1,colName2) ,
78
PERIOD FOR SYSTEM_TIME
89
)WITH(
910
type ='redis',
@@ -27,9 +28,10 @@
2728
| tableName | 注册到flink的表名称(可选填;不填默认和redis对应的表名称相同)|
2829
| colName | 列名称,维表列名格式 表名:主键名:主键值:列名]|
2930
| colType | 列类型,当前只支持varchar|
31+
| PRIMARY KEY |主键,多个字段做为联合主键时以逗号分隔
3032
| PERIOD FOR SYSTEM_TIME | 关键字表明该定义的表为维表信息|
3133

32-
## 3.参数
34+
## 4.参数
3335

3436
|参数名称|含义|是否必填|默认值|
3537
|----|---|---|----|
@@ -51,7 +53,7 @@
5153
* cacheTTLMs:缓存的过期时间(ms)
5254
* ALL: 缓存全量表数据
5355

54-
## 4.样例
56+
## 5.样例
5557
```
5658
create table sideTable(
5759
channel varchar,
@@ -70,5 +72,10 @@ create table sideTable(
7072
);
7173
7274
```
75+
## 6.缓存redis的存储结构规则
76+
```
77+
redis使用散列类型 hash 数据结构,key=tableName_primaryKey1_primaryKey2,value={column1=value1, column2=value2}
78+
如果以班级class表为例,id和name作为联合主键,那么redis的结构为 <class_1_john ,{id=1, name=john, age=12}>
79+
```
7380

7481

redis5/redis5-side/redis-all-side/src/main/java/com/dtstack/flink/sql/side/redis/RedisAllReqRow.java

Lines changed: 70 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
package com.dtstack.flink.sql.side.redis;
2020

2121
import com.dtstack.flink.sql.side.*;
22+
import com.dtstack.flink.sql.side.redis.enums.RedisType;
2223
import com.dtstack.flink.sql.side.redis.table.RedisSideReqRow;
2324
import com.dtstack.flink.sql.side.redis.table.RedisSideTableInfo;
2425
import com.esotericsoftware.minlog.Log;
2526
import org.apache.calcite.sql.JoinType;
27+
import org.apache.commons.collections.CollectionUtils;
28+
import org.apache.commons.collections.MapUtils;
29+
import org.apache.commons.lang.StringUtils;
2630
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
2731
import org.apache.flink.api.java.typeutils.RowTypeInfo;
2832
import com.google.common.collect.Maps;
@@ -85,13 +89,14 @@ protected void reloadCache() {
8589
}
8690

8791
cacheRef.set(newCache);
88-
LOG.info("----- Redis all cacheRef reload end:{}", Calendar.getInstance());
92+
LOG.info("----- Redis all cacheRef reload end:{}", newCache.size());
8993
}
9094

9195
@Override
9296
public void flatMap(Row row, Collector<Row> out) throws Exception {
9397
Map<String, String> inputParams = Maps.newHashMap();
94-
for(Integer conValIndex : sideInfo.getEqualValIndex()){
98+
for (int i = 0; i < sideInfo.getEqualValIndex().size(); i++) {
99+
Integer conValIndex = sideInfo.getEqualValIndex().get(i);
95100
Object equalObj = row.getField(conValIndex);
96101
if(equalObj == null){
97102
if(sideInfo.getJoinType() == JoinType.LEFT){
@@ -100,107 +105,55 @@ public void flatMap(Row row, Collector<Row> out) throws Exception {
100105
}
101106
return;
102107
}
103-
String columnName = sideInfo.getEqualFieldList().get(conValIndex);
104-
inputParams.put(columnName, equalObj.toString());
108+
inputParams.put(sideInfo.getEqualFieldList().get(i), equalObj.toString());
109+
}
110+
String key = buildCacheKey(inputParams);
111+
if(StringUtils.isBlank(key)){
112+
return;
105113
}
106-
String key = buildKey(inputParams);
107114

108115
Map<String, String> cacheMap = cacheRef.get().get(key);
109-
110-
if (cacheMap == null){
111-
if(sideInfo.getJoinType() == JoinType.LEFT){
112-
Row data = fillData(row, null);
113-
out.collect(data);
114-
}else{
116+
if(MapUtils.isEmpty(cacheMap)){
117+
if(sideInfo.getJoinType() != JoinType.LEFT){
115118
return;
116119
}
117-
120+
Row data = fillData(row, null);
121+
out.collect(data);
118122
return;
119-
}
120123

124+
}
121125
Row newRow = fillData(row, cacheMap);
122126
out.collect(newRow);
123127
}
124128

125-
private String buildKey(Map<String, String> inputParams) {
126-
String tableName = tableInfo.getTableName();
127-
StringBuilder key = new StringBuilder();
128-
for (int i=0; i<inputParams.size(); i++){
129-
key.append(tableName).append(":").append(inputParams.keySet().toArray()[i]).append(":")
130-
.append(inputParams.get(inputParams.keySet().toArray()[i]));
129+
private String buildCacheKey(Map<String, String> refData) {
130+
StringBuilder keyBuilder = new StringBuilder(tableInfo.getTableName());
131+
List<String> primaryKeys = tableInfo.getPrimaryKeys();
132+
for(String primaryKey : primaryKeys){
133+
if(!refData.containsKey(primaryKey)){
134+
return null;
135+
}
136+
keyBuilder.append("_").append(refData.get(primaryKey));
131137
}
132-
return key.toString();
138+
return keyBuilder.toString();
133139
}
134140

141+
135142
private void loadData(Map<String, Map<String, String>> tmpCache) throws SQLException {
136143
JedisCommands jedis = null;
137-
138144
try {
139-
for(int i=0; i<CONN_RETRY_NUM; i++){
140-
141-
try{
142-
jedis = getJedis(tableInfo);
143-
break;
144-
}catch (Exception e){
145-
if(i == CONN_RETRY_NUM - 1){
146-
throw new RuntimeException("", e);
147-
}
148-
149-
try {
150-
String jedisInfo = "url:" + tableInfo.getUrl() + ",pwd:" + tableInfo.getPassword() + ",database:" + tableInfo.getDatabase();
151-
LOG.warn("get conn fail, wait for 5 sec and try again, connInfo:" + jedisInfo);
152-
Thread.sleep(5 * 1000);
153-
} catch (InterruptedException e1) {
154-
LOG.error("", e1);
155-
}
156-
}
145+
StringBuilder keyPattern = new StringBuilder(tableInfo.getTableName());
146+
for(String key : tableInfo.getPrimaryKeys()){
147+
keyPattern.append("_").append("*");
148+
};
149+
jedis = getJedisWithRetry(CONN_RETRY_NUM);
150+
Set<String> keys = getRedisKeys(RedisType.parse(tableInfo.getRedisType()), jedis, keyPattern.toString());
151+
if(CollectionUtils.isEmpty(keys)){
152+
return;
157153
}
158-
159-
if (tableInfo.getRedisType() != 3){
160-
String perKey = tableInfo.getTableName() + "*";
161-
Set<String> keys = ((Jedis) jedis).keys(perKey);
162-
List<String> newPerKeys = new LinkedList<>();
163-
for (String key : keys){
164-
String[] splitKey = key.split(":");
165-
String newKey = splitKey[0] + ":" + splitKey[1] + ":" + splitKey[2];
166-
newPerKeys.add(newKey);
167-
}
168-
List<String> list = newPerKeys.stream().distinct().collect(Collectors.toList());
169-
for(String key : list){
170-
Map<String, String> kv = Maps.newHashMap();
171-
String[] primaryKv = key.split(":");
172-
kv.put(primaryKv[1], primaryKv[2]);
173-
String pattern = key + "*";
174-
Set<String> realKeys = ((Jedis) jedis).keys(pattern);
175-
for (String realKey : realKeys){
176-
kv.put(realKey.split(":")[3], jedis.get(realKey));
177-
}
178-
tmpCache.put(key, kv);
179-
}
180-
} else {
181-
String perKey = tableInfo.getTableName() + "*";
182-
Set<String> keys = keys((JedisCluster) jedis, perKey);
183-
List<String> newPerKeys = new LinkedList<>();
184-
for (String key : keys){
185-
String[] splitKey = key.split(":");
186-
String newKey = splitKey[0] + ":" + splitKey[1] + ":" + splitKey[2];
187-
newPerKeys.add(newKey);
188-
}
189-
List<String> list = newPerKeys.stream().distinct().collect(Collectors.toList());
190-
for(String key : list){
191-
Map<String, String> kv = Maps.newHashMap();
192-
String[] primaryKv = key.split(":");
193-
kv.put(primaryKv[1], primaryKv[2]);
194-
String pattern = key + "*";
195-
Set<String> realKeys = keys((JedisCluster) jedis, pattern);
196-
for (String realKey : realKeys){
197-
kv.put(realKey.split(":")[3], jedis.get(realKey));
198-
}
199-
tmpCache.put(key, kv);
200-
}
154+
for(String key : keys){
155+
tmpCache.put(key, jedis.hgetAll(key));
201156
}
202-
203-
204157
} catch (Exception e){
205158
LOG.error("", e);
206159
} finally {
@@ -223,7 +176,7 @@ private void loadData(Map<String, Map<String, String>> tmpCache) throws SQLExcep
223176
private JedisCommands getJedis(RedisSideTableInfo tableInfo) {
224177
String url = tableInfo.getUrl();
225178
String password = tableInfo.getPassword();
226-
String database = tableInfo.getDatabase();
179+
String database = tableInfo.getDatabase() == null ? "0" : tableInfo.getDatabase();
227180
int timeout = tableInfo.getTimeout();
228181
if (timeout == 0){
229182
timeout = 1000;
@@ -245,33 +198,58 @@ private JedisCommands getJedis(RedisSideTableInfo tableInfo) {
245198
}
246199
JedisCommands jedis = null;
247200
GenericObjectPoolConfig poolConfig = setPoolConfig(tableInfo.getMaxTotal(), tableInfo.getMaxIdle(), tableInfo.getMinIdle());
248-
switch (tableInfo.getRedisType()){
201+
switch (RedisType.parse(tableInfo.getRedisType())){
249202
//单机
250-
case 1:
203+
case STANDALONE:
251204
pool = new JedisPool(poolConfig, firstIp, Integer.parseInt(firstPort), timeout, password, Integer.parseInt(database));
252205
jedis = pool.getResource();
253206
break;
254207
//哨兵
255-
case 2:
208+
case SENTINEL:
256209
jedisSentinelPool = new JedisSentinelPool(tableInfo.getMasterName(), ipPorts, poolConfig, timeout, password, Integer.parseInt(database));
257210
jedis = jedisSentinelPool.getResource();
258211
break;
259212
//集群
260-
case 3:
213+
case CLUSTER:
261214
jedis = new JedisCluster(addresses, timeout, timeout,1, poolConfig);
215+
default:
216+
break;
262217
}
263218

264219
return jedis;
265220
}
266221

267-
private Set<String> keys(JedisCluster jedisCluster, String pattern){
222+
private JedisCommands getJedisWithRetry(int retryNum) {
223+
while (retryNum-- > 0){
224+
try {
225+
return getJedis(tableInfo);
226+
} catch (Exception e) {
227+
if(retryNum <= 0){
228+
throw new RuntimeException("getJedisWithRetry error", e);
229+
}
230+
try {
231+
String jedisInfo = "url:" + tableInfo.getUrl() + ",pwd:" + tableInfo.getPassword() + ",database:" + tableInfo.getDatabase();
232+
LOG.warn("get conn fail, wait for 5 sec and try again, connInfo:" + jedisInfo);
233+
Thread.sleep(5 * 1000);
234+
} catch (InterruptedException e1) {
235+
LOG.error("", e1);
236+
}
237+
}
238+
}
239+
return null;
240+
}
241+
242+
private Set<String> getRedisKeys(RedisType redisType, JedisCommands jedis, String keyPattern){
243+
if(!redisType.equals(RedisType.CLUSTER)){
244+
return ((Jedis) jedis).keys(keyPattern);
245+
}
268246
Set<String> keys = new TreeSet<>();
269-
Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();
247+
Map<String, JedisPool> clusterNodes = ((JedisCluster)jedis).getClusterNodes();
270248
for(String k : clusterNodes.keySet()){
271249
JedisPool jp = clusterNodes.get(k);
272250
Jedis connection = jp.getResource();
273251
try {
274-
keys.addAll(connection.keys(pattern));
252+
keys.addAll(connection.keys(keyPattern));
275253
} catch (Exception e){
276254
LOG.error("Getting keys error: {}", e);
277255
} finally {

0 commit comments

Comments
 (0)