読者です 読者をやめる 読者になる 読者になる

MySQLからRedisへのimport tool

java redis rdbms

この程度のことは何かしらの言語を使って、一瞬で作らなきゃだなぁ、と思って何が適当か少し考えてみた。

想定される制約条件は以下。

  • いろいろなサーバーで実行したい
  • Root権限が無いケースも想定
  • インストールされているのは Perl, Python, Java(Maven入り)
  • 入ってないのは Ruby, OCaml

と色々(もしかすると上記条件以外にも頭の片隅にある暗黙の制約があるかも)考えるとJavaが良さげ。

で、シンプルに書くとこんな感じかな?ということでメモ書き。

  • pom.xmlのdependencies
  <dependencies>
  	<dependency>
  		<groupId>mysql</groupId>
  		<artifactId>mysql-connector-java</artifactId>
  		<version>5.1.15</version>
  		<type>jar</type>
  		<scope>compile</scope>
  	</dependency>
  	<dependency>
  		<groupId>redis.clients</groupId>
  		<artifactId>jedis</artifactId>
  		<version>1.5.2</version>
  		<type>jar</type>
  		<scope>compile</scope>
  	</dependency>
  </dependencies>
  • Main.java(クラス名は適当, DBのユーザーとかも)
public class Main {
  public static void main(String[] args) throws SQLException {
    final String url = "jdbc:mysql://localhost/hogehoge";
    final Jedis jedis = new Jedis("localhost");
    Connection conn = DriverManager.getConnection(url, "root", "hogehoge");
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select m.name, m.id, m.age, d.name from members m, depts d where d.id = m.dept_id");
    while (rs.next()) {
      String key = rs.getString("m.name");
      String val = "[age:" + rs.getInt("age") + "][dept:" + rs.getString("d.name") + "]";
      jedis.set(key, val);
    }
    rs.close();
    stmt.close();
    jedis.disconnect();
  }
}

実行はMavenのexec pluginを使うとこんな感じ。

$ mvn exec:java -Dexec.mainClass=com.komamitsu.importer.Main