Redis 커넥터는 Redis 의 키/값 한 쌍을 한 행으로 본다. 아무 설정도 하지 않으면 행은 내부 컬럼만 갖는다. 값을 컬럼으로 쪼개려면 테이블 정의 파일을 따로 둬야 한다. Redis 커넥터는 읽기 전용이라 INSERT 로 Redis 에 쓸 수 없고, CREATE TABLE 같은 DDL 도 지원하지 않는다.
지원 범위는 좁다. 키는 string 과 zset, 값은 string 과 hash 만 다룬다. Redis Cluster 는 지원하지 않는다.
카탈로그는 언제나 .properties 파일이다. JSON 으로 된 카탈로그 파일 같은 것은 없다.
# etc/catalog/redis.properties
connector.name=redis
redis.nodes=redis.example.net:6379
redis.table-names=billing.billing_data
redis.default-schema=default
redis.table-description-dir=/etc/trino/redis
redis.password=${REDIS_PASSWORD}
redis.database-index=0
주요 속성은 다음과 같다.
| 속성 | 기본값 | 뜻 |
|---|---|---|
redis.nodes |
없음 (필수) | hostname:port. redis:// 같은 URL 형식이 아니다 |
redis.table-names |
없음 | 이 카탈로그가 제공할 테이블 목록. <스키마>.<테이블> 로 한정하거나 이름만 쓴다 |
redis.default-schema |
default |
스키마를 붙이지 않은 테이블이 들어갈 스키마 |
redis.table-description-dir |
etc/redis |
테이블 정의 JSON 파일을 두는 디렉터리 |
redis.table-description-cache-ttl |
5m |
정의 파일을 다시 읽는 주기 |
redis.key-prefix-schema-table |
false |
true 면 스키마:테이블 로 시작하는 키만 훑는다 |
redis.key-delimiter |
: |
위 접두사에서 스키마와 테이블을 가르는 문자 |
redis.hide-internal-columns |
true |
내부 컬럼을 DESCRIBE · SELECT * 에서 감춘다 |
redis.scan-count |
100 |
SCAN 명령의 COUNT 값 |
redis.max-keys-per-fetch |
100 |
MGET · HGETALL 한 번에 묶는 키 수 |
redis.user · redis.password |
없음 | 인증 정보 |
redis.tls.enabled |
false |
TLS 사용 여부. keystore · truststore 속성이 따로 있다 |
redis.table-description-cache-ttl 덕분에 정의 파일을 추가·수정할 때 Trino 를 재기동할 필요는 없다. 다만 정의 파일은 코디네이터만 읽는다.
redis.key-prefix 라는 속성은 없다. 접두사로 키를 거르고 싶다면 redis.key-prefix-schema-table=true 를 켜고 키를 스키마:테이블:... 형태로 맞춘다.
정의 파일이 없어도 아래 컬럼은 항상 있다. redis.hide-internal-columns=false 로 두면 SELECT * 에도 나온다.
| 컬럼 | 타입 | 내용 |
|---|---|---|
_key |
varchar | Redis 키 |
_value |
varchar | 키에 대응하는 값 |
_key_length |
bigint | 키의 바이트 수 |
_value_length |
bigint | 값의 바이트 수 |
_key_corrupt |
boolean | 키 디코딩 실패 여부 |
_value_corrupt |
boolean | 값 디코딩 실패 여부 |
파일 이름은 자유이고 확장자만 .json 이면 된다. 구조는 tableName · schemaName · key · value 네 개다.
{
"tableName": "users",
"schemaName": "default",
"key": {
"dataFormat": "raw",
"fields": [
{ "name": "redis_key", "type": "VARCHAR", "hidden": "false" }
]
},
"value": {
"dataFormat": "json",
"fields": [
{ "name": "id", "mapping": "id", "type": "BIGINT" },
{ "name": "name", "mapping": "name", "type": "VARCHAR" },
{ "name": "email", "mapping": "email", "type": "VARCHAR" },
{ "name": "age", "mapping": "age", "type": "INTEGER" }
]
}
}
값이 JSON 문자열일 때의 예다. Redis 쪽 데이터는 이렇게 들어 있다.
redis-cli SET users:1 '{"id":1,"name":"Alice","email":"alice@example.net","age":30}'
mapping 은 원본에서 읽어 올 이름이고 name 은 Trino 에서 보일 컬럼 이름이다. 둘이 같아도 mapping 은 적어 두는 편이 낫다.
값이 Redis 해시라면 value.dataFormat 을 hash 로 한다. 해시는 Redis 커넥터가 따로 추가한 형식이다.
redis-cli HSET billing:000001 billingdoc INV123 billingtype regular company ACME
{
"tableName": "billing_data",
"schemaName": "billing",
"key": {
"dataFormat": "raw",
"fields": [
{ "name": "redis_key", "type": "VARCHAR" }
]
},
"value": {
"dataFormat": "hash",
"fields": [
{ "name": "billingdoc", "mapping": "billingdoc", "type": "VARCHAR" },
{ "name": "billingtype", "mapping": "billingtype", "type": "VARCHAR" },
{ "name": "company", "mapping": "company", "type": "VARCHAR" }
]
}
}
mapping 값이 해시 필드 이름과 정확히 같아야 한다. no mapping for column handle 오류는 대개 여기서 난다.
조회는 <카탈로그>.<스키마>.<테이블> 이다.
SELECT * FROM redis.billing.billing_data;
설정이 먹지 않을 때는 아래 순서로 좁힌다.
SHOW CATALOGS;
SHOW SCHEMAS FROM redis;
SHOW TABLES FROM redis.billing;
DESCRIBE redis.billing.billing_data;
DESCRIBE 에 내부 컬럼만 나오면 정의 파일을 읽지 못한 것이다. 파일 위치가 redis.table-description-dir 과 맞는지, 코디네이터에 있는지, tableName · schemaName 이 redis.table-names 와 일치하는지 본다. 테이블 자체가 안 보이면 redis.table-names 에 없는 것이다.
키가 commonname_1 처럼 _ 로 번호가 붙는 형태에서 접두사만으로 대상 키를 거르는 구성은 원본 대화에서 끝내 동작을 확인하지 못했다. 커넥터는 스키마·테이블 접두사를 redis.key-delimiter 하나로 가르므로, 임의 접두사 패턴을 그대로 쓰기보다 키 체계를 스키마:테이블:식별자 로 맞추고 redis.key-prefix-schema-table=true 를 켜는 편이 확실하다. 기존 키 체계를 바꿀 수 없는 경우의 방법은 확인하지 못했다. (확인 필요)