在完成添加Tair缓存节点、创建Tair缓存节点账号以及创建Tair自定义连接地址操作后,您需要配置表映射关系,明确PolarDB数据库中的表到Tair缓存节点的Redis协议的KV(Key-Value)结构或者KKV(Key-Key-Value)结构,从而使Tair缓存节点按照您的业务预期来提供缓存能力。
前提条件
已通过创建的Tair自定义连接地址连接到PolarDB数据库集群。
配置说明
目前映射配置支持String映射和Hash映射两种模式。在此之前,我们来了解一下系统表。
系统表介绍
为了在PolarDB中实现Tair缓存一体化的能力,PolarDB预置了如下系统表:
-- system table, create by default, mysql
-- string映射模式的系统表
CREATE TABLE mysql.`tair_string_containers` (
`name` varchar(50) NOT NULL COMMENT '映射的唯一名,用于唯一确定一个映射',
`db_schema` varchar(250) NOT NULL COMMENT '映射的表所在的db',
`db_table` varchar(250) NOT NULL COMMENT '映射表',
`key_column` varchar(250) NOT NULL COMMENT '映射的key使用的列',
`value_column` varchar(250) NOT NULL COMMENT '映射的value使用的列',
`unique_idx_name_on_key` varchar(250) NOT NULL COMMENT '使用的索引名,因为tair不感知所有的索引,也不使用优化器,因此需要手动指定索引',
PRIMARY KEY (`name`)
);
-- hash映射模式的系统表
CREATE TABLE IF NOT EXISTS `tair_hash_containers` (
`name` varchar(50) NOT NULL COMMENT '映射的唯一名,用于唯一确定一个映射',
`db_schema` varchar(250) NOT NULL COMMENT '映射的表所在的db',
`db_table` varchar(250) NOT NULL COMMENT '映射表',
`key_column` varchar(250) NOT NULL COMMENT '映射的key使用的列',
`value_column` varchar(250) NOT NULL COMMENT '映射的value使用的列',
`unique_idx_name_on_key` varchar(250) NOT NULL COMMENT '使用的索引名,因为tair不感知所有的索引,也不使用优化器,因此需要手动指定索引',
PRIMARY KEY (`name`)
);
支持的字段数据类型如下:
key | value | |
TINYINT | 支持 | 支持 |
SMALLINT | 支持 | 支持 |
MEDIUMINT | 暂未支持 | 暂未支持 |
INT或INTEGER | 支持 | 支持 |
BIGINT | 支持 | 支持 |
FLOAT | 无意义,不支持 | 支持 |
DOUBLE | 无意义,不支持 | 支持 |
DECIMAL | 暂未支持 | 暂未支持 |
CHAR | 支持 | 支持 |
VARCHAR | 支持 | 支持 |
TINYBLOB | 支持,不建议 | 支持 |
TINYTEXT | 支持,不建议 | 支持 |
BLOB | 支持,不建议 | 支持 |
TEXT | 支持,不建议 | 支持 |
MEDIUMBLOB | 支持,不建议 | 支持 |
MEDIUMTEXT | 支持,不建议 | 支持 |
LONGBLOB | 暂未支持 | 暂未支持 |
LONGTEXT | 暂未支持 | 暂未支持 |
(推荐)模式一:String映射
为了保证更好的使用体验,建议您优先选择String映射模式进行配置。
String映射支持在具有读写权限的表中,使用KV结构,将一个column作为key,一个column作为value。
为保证key的唯一性,选择作为key的column,需要事先创建索引unique_idx_name_on_key
。
以下通过一个示例,带您了解如何通过SQL配置String映射:
CREATE database test_db;
use test_db
CREATE TABLE `test` (
`key` varchar(50) NOT NULL,
`value` varchar(50) DEFAULT NULL,
`value2` varchar(50) DEFAULT NULL,
PRIMARY KEY (`key`)
);
insert into mysql.tair_string_containers values ("example", "test_db", "test", "key", "value", "PRIMARY");
insert into test values ("k", "v", "v2");
FLUSH TAIR;
从Tair缓存节点以Redis协议读取数据时,需要以设置的name作为key的前缀,并使用@
分隔。例如:
redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> get example@k
"v"
模式二:Hash映射
Hash映射符合Redis Hash结构用法,支持在具有读写权限的表中,使用KKV结构,将一个column作为key,多个column的字段名作为field,column的数据作为子field的value。
为保证key的唯一性,选择作为key的column,需要事先创建索引unique_idx_name_on_key
。
以下通过一个示例,带您了解如何通过SQL配置Hash映射:
CREATE database test_db;
use test_db
CREATE TABLE `test` (
`key` varchar(50) NOT NULL,
`value` varchar(50) DEFAULT NULL,
`value2` varchar(50) DEFAULT NULL,
PRIMARY KEY (`key`)
);
insert into mysql.tair_hash_containers values ("hexample", "test_db", "test", "key", "value,value2", "PRIMARY");
insert into test values ("k", "v", "v2");
FLUSH TAIR;
从Tair缓存节点以Redis协议读取数据时,需要以设置的name作为key的前缀,并使用@
分隔。例如:
redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> hget hexample@k value2
"v2"
127.0.0.1:6379> hget hexample@k value
"v"
多column组成key
当前String映射模式和Hash映射模式都支持多column组成key。您只需要在key_column
中传入多个逗号分隔的column名称即可。
为了保证key的唯一性,选择作为key的column,需要创建unique_idx_name_on_key
索引覆盖所有的key_column。
以下通过一个示例,带您了解如何通过SQL配置多column组成key:
CREATE database test_db;
use test_db
CREATE TABLE `test` (
`user` varchar(50) NOT NULL,
`phone` varchar(50) NOT NULL,
`value` varchar(50) DEFAULT NULL,
`value2` varchar(50) DEFAULT NULL,
);
ALTER TABLE test ADD UNIQUE INDEX idx_user_phone (user, phone);
insert into mysql.tair_hash_containers values ("hexample", "test_db", "test", "user,phone", "value,value2", "idx_user_phone");
insert into test values ("test_user", "13600001234", "v", "v2");
FLUSH TAIR;
从Tair缓存节点以Redis协议读取数据时,需要拼接多个key_column,并使用#
分隔。例如:
redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> hget hexample@test_user#13600001234 value2
"v2"
127.0.0.1:6379> hget hexample@test_user#13600001234 value
"v"
问题排查
添加映射后,执行如下命令以刷新配置:
FLUSH TAIR;
刷新配置后,有些配置可能无法刷新成功,此时可以使用如下命令,查看对应的错误日志:
show warnings;
后续操作
在完成表映射关系配置后,您就可以连接到PolarDB数据库集群,并发出Redis命令以使用Tair缓存节点提供的功能。