Apache ShardingSphere 行表达式配置详解

Apache ShardingSphere 行表达式配置详解

shardingsphere Distributed SQL transaction & query engine for data sharding, scaling, encryption, and more - on any database. shardingsphere 项目地址: https://gitcode.com/gh_mirrors/sh/shardingsphere

什么是行表达式

行表达式是 Apache ShardingSphere 中一种简洁高效的配置方式,主要用于定义数据分片规则中的实际数据节点(actualDataNodes)和分片算法表达式。它通过特定的语法规则,可以快速生成一系列符合特定模式的字符串,大大简化了分片规则的配置工作。

行表达式的四种实现类型

Apache ShardingSphere 提供了四种行表达式实现类型,每种类型适用于不同的场景和需求。

1. GROOVY 类型(默认)

GROOVY 类型使用 Groovy 语法来实现行表达式功能,是最常用的一种实现方式。

语法特点:

  • 使用 ${ expression }$->{ expression } 标识表达式
  • 支持 Groovy 的所有操作
  • ${begin..end} 表示范围区间
  • ${[unit1, unit2, unit_x]} 表示枚举值
  • 多个表达式会进行笛卡尔积组合

使用示例:

# 生成 t_order_1, t_order_2, t_order_3
<GROOVY>t_order_${1..3}

# 生成 online_table1, online_table2, online_table3, offline_table1, offline_table2, offline_table3
<GROOVY>${['online', 'offline']}_table${1..3}

适用场景:

  • 大多数常规分片场景
  • 需要灵活生成复杂分片规则的场景

2. LITERAL 类型

LITERAL 类型是最简单的实现,它不会对输入内容做任何转换处理。

语法特点:

  • 直接输出配置的字符串
  • 不支持任何表达式解析
  • 适用于 GraalVM Native Image 环境

使用示例:

# 直接输出 t_order_1, t_order_2, t_order_3
<LITERAL>t_order_1, t_order_2, t_order_3

# 直接输出 t_order_${1..3},不会解析表达式
<LITERAL>t_order_${1..3}

适用场景:

  • 需要精确控制输出内容的场景
  • 在 GraalVM Native Image 环境下使用

3. INTERVAL 类型

INTERVAL 类型专门用于处理时间区间相关的分片规则,采用键值对语法定义时间范围。

语法特点:

  • 使用 Key=Value 格式定义参数
  • 多个参数用 ; 分隔
  • 支持时间区间自动生成

主要参数说明:

  • P:前缀,表示结果单元的前缀格式
  • SP:后缀模式,表示时间戳格式
  • DIA:时间间隔量
  • DIU:时间间隔单位
  • DL:时间下限
  • DU:时间上限
  • C:日历系统(可选)

使用示例:

# 生成 t_order_2023_1202, t_order_2023_1203, t_order_2023_1204
<INTERVAL>P=t_order_;SP=yyyy_MMdd;DIA=1;DIU=Days;DL=2023_1202;DU=2023_1204

# 生成 t_order_2023_10, t_order_2023_11, t_order_2023_12
<INTERVAL>P=t_order_;SP=yyyy_MM;DIA=1;DIU=Months;DL=2023_10;DU=2023_12

# 使用日本日历系统生成表名
<INTERVAL>P=t_order_;SP=GGGGyyyy_MM_dd;DIA=1;DIU=Days;DL=平成0001_12_05;DU=平成0001_12_06;C=Japanese

适用场景:

  • 按时间范围分片的场景
  • 需要自动生成时间序列表名的场景

4. ESPRESSO 类型(实验性)

ESPRESSO 类型是实验性功能,通过 GraalVM Truffle 的 Espresso 实现在 GraalVM Native Image 环境下支持 Groovy 语法。

语法特点:

  • 语法规则与 GROOVY 类型相同
  • 需要额外依赖支持
  • 目前仅支持 Linux amd64 环境

使用示例:

# 生成 t_order_1, t_order_2, t_order_3
<ESPRESSO>t_order_${1..3}

# 生成 online_table1, online_table2, online_table3, offline_table1, offline_table2, offline_table3
<ESPRESSO>${['online', 'offline']}_table${1..3}

适用场景:

  • 在 GraalVM Native Image 环境下需要使用 Groovy 语法的场景

配置示例

下面是一个完整的分片规则配置示例,展示了不同行表达式类型的实际应用:

rules:
- !SHARDING
  tables:
    t_order: 
      actualDataNodes: <LITERAL>ds_0.t_order_0, ds_0.t_order_1, ds_1.t_order_0, ds_1.t_order_1
      tableStrategy: 
        standard:
          shardingColumn: order_id
          shardingAlgorithmName: t_order_inline
      keyGenerateStrategy:
        column: order_id
        keyGeneratorName: snowflake
  defaultDatabaseStrategy:
    standard:
      shardingColumn: user_id
      shardingAlgorithmName: database_inline
  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: <GROOVY>ds_${user_id % 2}
    t_order_inline:
      type: INLINE
      props:
        algorithm-expression: t_order_${order_id % 2}
  keyGenerators:
    snowflake:
      type: SNOWFLAKE

选择建议

  1. 常规场景:优先使用 GROOVY 类型,功能最全面,使用最广泛
  2. 精确控制场景:使用 LITERAL 类型,避免表达式解析
  3. 时间分片场景:使用 INTERVAL 类型,简化时间区间配置
  4. GraalVM Native Image 环境:根据是否需要 Groovy 语法选择 LITERAL 或 ESPRESSO 类型

注意事项

  1. 如果不指定类型,默认使用 GROOVY 类型
  2. INTERVAL 类型会忽略时区信息,使用时需确保时间格式一致
  3. ESPRESSO 类型是实验性功能,生产环境需谨慎使用
  4. 使用非默认类型时,需确保相关依赖已正确配置

通过合理选择和使用行表达式类型,可以大大简化 Apache ShardingSphere 的分片规则配置,提高配置效率和可维护性。

shardingsphere Distributed SQL transaction & query engine for data sharding, scaling, encryption, and more - on any database. shardingsphere 项目地址: https://gitcode.com/gh_mirrors/sh/shardingsphere

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娄朋虎Imogene

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值