Flink-Connector-Redis 使用指南
项目简介
Flink-Connector-Redis 是一个基于 Lettuce 的异步 Flink 连接器,支持 SQL Join、Sink 查询缓存以及调试等功能。该项目基于 bahir-flink 二次开发,主要改进包括:
- 使用 Lettuce 替换 Jedis,同步读写改为异步读写,大幅提升性能
- 增加 Table/SQL API,支持 select/维表 join 查询
- 增加关联查询缓存(支持增量与全量)
- 增加支持整行保存功能,用于多字段的维表关联查询
- 增加限流功能,用于 Flink SQL 在线调试
- 支持 Flink 高版本(1.12、1.13、1.14+)
- 统一过期策略等
- 支持 Flink CDC 删除及其他 RowKind.DELETE
- 支持 select 查询
项目结构
flink-connector-redis
├── src/main/java # 核心业务逻辑代码
│ ├── command # Redis 命令相关类
│ ├── config # 配置处理类
│ ├── container # Redis 容器管理
│ ├── converter # 数据转换器
│ ├── hanlder # 处理器服务
│ ├── mapper # 映射器
│ └── table # 表相关功能
├── src/test/java # 测试代码
├── pom.xml # Maven 构建配置
├── README.md # 中文文档
├── README-en.md # 英文文档
└── img.png # 项目图片
快速开始
安装依赖
项目依赖 Lettuce(6.2.1) 及 netty-transport-native-epoll(4.1.82.Final),根据环境选择对应的 jar 包:
<dependency>
<groupId>io.github.jeff-zou</groupId>
<artifactId>flink-connector-redis</artifactId>
<version>1.4.3</version>
<!-- 没有单独引入依赖时使用 -->
<!-- <classifier>jar-with-dependencies</classifier> -->
</dependency>
自行打包
执行打包命令:
mvn package
将生成的包放入 Flink lib 目录即可使用。
配置参数详解
主要连接参数
| 参数 | 默认值 | 类型 | 说明 |
|---|---|---|---|
| connector | (none) | String | 必须设置为 'redis' |
| host | (none) | String | Redis 服务器地址 |
| port | 6379 | Integer | Redis 端口 |
| password | null | String | Redis 密码 |
| database | 0 | Integer | 数据库编号 |
| timeout | 2000 | Integer | 连接超时时间(ms) |
| cluster-nodes | (none) | String | 集群节点地址(集群模式) |
| command | (none) | String | Redis 操作命令 |
| redis-mode | (none) | String | Redis 模式: single/cluster/sentinel |
| lookup.cache.max-rows | -1 | Integer | 查询缓存大小 |
| lookup.cache.ttl | -1 | Integer | 查询缓存过期时间(秒) |
| lookup.cache.load-all | false | Boolean | 是否开启全量缓存 |
数据存储结构
支持两种数据存储方式:
column 模式(默认)
create table sink_redis(username VARCHAR, passport VARCHAR) with ('command'='set')
-- username 为 key, passport 为 value
row 模式
create table sink_redis(username VARCHAR, passport VARCHAR) with ('command'='set', 'value.data.structure'='row')
-- username 为 key, username\01passport 为 value
命令支持情况
| 命令 | 写入 | 查询 | 维表关联 | 删除 |
|---|---|---|---|---|
| set | set | get | get | del |
| hset | hset | hget | hget | hdel |
| rpush/lpush | rpush/lpush | lrange | - | - |
| incrBy | incrBy | get | get | 反向操作 |
| sadd | sadd | srandmember | - | srem |
| zadd | zadd | zscore | zscore | zrem |
使用示例
维表查询示例
-- 创建 Redis 表
create table sink_redis(name varchar, level varchar, age varchar) with (
'connector'='redis',
'host'='10.11.80.147',
'port'='7001',
'redis-mode'='single',
'password'='******',
'command'='hset'
);
-- 插入测试数据
insert into sink_redis select * from (values ('3', '3', '100'));
-- 创建维表
create table dim_table (name varchar, level varchar, age varchar) with (
'connector'='redis',
'host'='10.11.80.147',
'port'='7001',
'redis-mode'='single',
'password'='*****',
'command'='hget',
'lookup.cache.max-rows'='10',
'lookup.cache.ttl'='10'
);
-- 创建数据源表
create table source_table (username varchar, level varchar, proctime as procTime()) with (
'connector'='datagen',
'rows-per-second'='1',
'fields.username.kind'='sequence',
'fields.username.start'='1',
'fields.username.end'='10',
'fields.level.kind'='sequence',
'fields.level.start'='1',
'fields.level.end'='10'
);
-- 关联查询
insert into result_table
select s.username, s.level, d.age
from source_table s
left join dim_table for system_time as of s.proctime as d
on d.name = s.username and d.level = s.level;
多字段维表关联
-- 创建表(row 模式)
create table sink_redis(uid VARCHAR, score double, score2 double) with (
'connector' = 'redis',
'host' = '10.11.69.176',
'port' = '6379',
'redis-mode' = 'single',
'password' = '****',
'command' = 'SET',
'value.data.structure' = 'row'
);
-- 插入数据
insert into sink_redis select * from (values ('1', 10.3, 10.1));
-- 创建关联表
create table join_table with ('command'='get', 'value.data.structure'='row') like sink_redis;
-- 执行关联查询
insert into result_table
select s.uid, s.username, j.score, j.score2
from source_table as s
join join_table for system_time as of s.proc_time as j on j.uid = s.uid;
数据类型转换
| Flink 类型 | Redis 转换 |
|---|---|
| CHAR/VARCHAR/String | String |
| BOOLEAN | String.valueOf() / Boolean.valueOf() |
| BINARY/VARBINARY | Base64 编码/解码 |
| DECIMAL | BigDecimal.toString() |
| TINYINT/SMALLINT/INTEGER | 数值转换 |
| DATE/TIME | 时间格式转换 |
| BIGINT/FLOAT/DOUBLE | 数值转换 |
| TIMESTAMP | 时间戳转换 |
开发环境
- IDE: IntelliJ IDEA
- 代码格式: google-java-format + Save Actions
- Flink 版本: 1.12/1.13/1.14+
- JDK: 1.8
- Lettuce: 6.2.1
注意事项
- Redis 不支持两段提交,无法实现精确一次语义
- 在线调试时可使用限流参数控制资源使用
- 集群模式需要配置正确的节点信息
- 哨兵模式需要额外配置 master.name 和 sentinels.info
获取帮助
如果在使用过程中遇到问题,可以参考项目中的测试用例或查看详细的使用文档。项目提供了丰富的中英文文档和示例代码,帮助用户快速上手和使用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




