[Java] Redisデータベースを接続して使い方(Jedisライブラリ)


Devlopment note / Java    作成日付 : 2022/02/16 18:13:17   修正日付 : 2022/02/16 18:14:39

こんにちは。明月です。


この投稿はJavaでRedisデータベースを接続して使い方(Jedisライブラリ)に関する説明です。


RedisデータベースはRDB種類ではなく、NoSQL種類のKey-Valueタイプのデータベースです。簡単に共有メモリのデータベースです。

以前の投稿でLinux環境にインストール及び使い方に関して説明したことがあります。

リンク - [CentOS] Redisデータベースをインストールする方法とコマンドを使い方


そのRedisデータベースをJavaで使ってみましょう。

JavaでRedisデータベースを使うためにMavenを通ってJedisライブラリをインストールしなければならないです。

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.1.1</version>
</dependency>


リポジトリ - https://mvnrepository.com/artifact/redis.clients/jedis/4.1.1


先に基本的にRedisデータベースに値を格納して取得するコード作成しましょう。

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;

public class Program {
  // 実行関数
  public static void main(String... args) {
    // redis接続する。
    try (var pool = new JedisPool("192.168.1.200", Protocol.DEFAULT_PORT)) {
      // Resource取得する。(これがPoolのインスタンスを生成する時に接続するか、Resource取得する時に接続するかの明確な説明がない)
      try (var jedis = pool.getResource()) {
        // testキーでhello world値を格納する。
        jedis.set("test", "hello world");
        // test1キーでhello world expire値を格納する(満了時間60秒)
        jedis.setex("test1", 60, "hello world expire");

        // testキーで値を取得する。
        var data = jedis.get("test");
        // コンソール出力
        System.out.println(data);
        // test1キーで値を取得する。
        data = jedis.get("test1");
        // コンソール出力
        System.out.println(data);
      }
    }
  }
}



上のソースにはtestキーでhello world値を格納しました。そしてtest1で満了時間60秒のhello world expire値を格納しました。

そしてtestとtest1のキーでデータを取得すると上で格納したhello world値が出力します。


関連関数に関してはAPIドキュメントを参照してください。

リンク - https://javadoc.io/doc/redis.clients/jedis/latest/index.html


上のソースは単純にkeyキーを利用してデータを格納して取得する処理です。

そうすると実践でプログラムを作成する時によく使われるコードを作成して見ましょう。

import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;

// Nodeクラス
class Node implements Serializable {
  // Serializableインターフェースを継承するとserialVersionUIDを設定しなければならない。
  private static final long serialVersionUID = 1L;
  // メンバー変数
  private String data;
  // メンバー変数のsetter 
  public void setData(String data) {
    // メンバー変数設定
    this.data = data;
  }
  // 出力関数
  public void print() {
    // コンソール出力
    System.out.println("data = " + data);
  }
}

public class Program {
  // Nodeクラスをシリアル化してbyteタイプに変換
  static byte[] convertToStringFromClass(Node node) {
    // シリアル化
    try (var baos = new ByteArrayOutputStream()) {
      try (var oos = new ObjectOutputStream(baos)) {
        // 変換
        oos.writeObject(node);
        // Nodeクラスをbyte配列に変換
        return baos.toByteArray();
      }
    } catch (Throwable e) {
      throw new RuntimeException(e);
    }
  }

  // 実行関数
  public static void main(String... args) {
    // redis接続する。
    try (var pool = new JedisPool("192.168.1.200", Protocol.DEFAULT_PORT)) {
      // Resource取得する。(これがPoolのインスタンスを生成する時に接続するか、Resource取得する時に接続するかの明確な説明がない)
      try (var jedis = pool.getResource()) {
        // インスタンス生成
        var node = new Node();
        // データ設定
        node.setData("Hello world");
        
        // Redisデータベースにnodeキーで設定
        jedis.set("node".getBytes(), convertToStringFromClass(node));
      }
    }
  }
}


Nodeクラスのインスタンスを生成してシリアル化してbyteタイプで変換しました。そしてbyteタイプで変換する値をRedisデータベースに入力しました。

また、格納したデータを取得しましょう。

import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.Serializable;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;

// Nodeクラス
class Node implements Serializable {
  // Serializableインターフェースを継承するとserialVersionUIDを設定しなければならない。
  private static final long serialVersionUID = 1L;
  // メンバー変数
  private String data;
  // メンバー変数のsetter 
  public void setData(String data) {
    // メンバー変数設定
    this.data = data;
  }
  // 出力関数
  public void print() {
    // コンソール出力
    System.out.println("data = " + data);
  }
}

public class Program {
  // データを逆直列化してNodeクラスで変換
  static Node convertToClassFromString(byte[] binary) {
    // 逆直列化
    try (var bais = new ByteArrayInputStream(binary)) {
      try (var ois = new ObjectInputStream(bais)) {
        // byte配列のデータをNodeのクラスで変換する。
        return (Node) ois.readObject();
      }
    } catch (Throwable e) {
      throw new RuntimeException(e);
    }
  }

  // 実行関数
  public static void main(String... args) {
    // redis接続する。
    try (var pool = new JedisPool("192.168.1.200", Protocol.DEFAULT_PORT)) {
      // Resource取得する。(これがPoolのインスタンスを生成する時に接続するか、Resource取得する時に接続するかの明確な説明がない)
      try (var jedis = pool.getResource()) {
        // Redisデータベースにnodeキーで取得する。
        var binary = jedis.get("node".getBytes());
        // byteタイプをnodeクラスで変換
        var node = convertToClassFromString(binary);
        // print関数実行
        node.print();
      }
    }
  }
}


Redisデータベースでnodeキーになっているbyte値を取得して逆直列化してNodeクラスに変換します。

print関数を呼び出すと入力したHello world値を出力します。


シリアル化すると同じJava言語のプログラムでは問題ありませんが、別の言語のプログラムでは使えません。それでJsonのStringタイプに変換して使いましょう。

import java.io.Serializable;
import com.google.gson.Gson;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;

// Nodeクラス
class Node implements Serializable {
  // Serializableインターフェースを継承するとserialVersionUIDを設定しなければならない。
  private static final long serialVersionUID = 1L;
  // メンバー変数
  private String data;
  // メンバー変数のsetter 
  public void setData(String data) {
    // メンバー変数設定
    this.data = data;
  }
  // 出力関数
  public void print() {
    // コンソール出力
    System.out.println("data = " + data);
  }
}

public class Program {
  // 実行関数
  public static void main(String... args) {
    Gson gson = new Gson();
    // redis接続する。 접속한다.
    try (var pool = new JedisPool("192.168.1.200", Protocol.DEFAULT_PORT)) {
      // Resource取得する。(これがPoolのインスタンスを生成する時に接続するか、Resource取得する時に接続するかの明確な説明がない)
      try (var jedis = pool.getResource()) {
        // インスタンスを生成
        var node = new Node();
        // データ設定
        node.setData("Hello world");
        // nodeインスタンスをjsonタイプのstringに変換
        var json = gson.toJson(node);
        // Redisデータベースにnodeキーで設定
        jedis.set("node", json);
      }
    }
  }
}


NodeインスタンスをGsonライブラリ利用してJsonタイプのStringデータに変換しました。その後でStringデータをRedisに格納しました。

import java.io.Serializable;
import com.google.gson.Gson;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;

// Nodeクラス
class Node implements Serializable {
  // Serializableインターフェースを継承するとserialVersionUIDを設定しなければならない。
  private static final long serialVersionUID = 1L;
  // メンバー変数
  private String data;
  // メンバー変数のsetter 
  public void setData(String data) {
    // メンバー変数設定
    this.data = data;
  }
  // 出力関数
  public void print() {
    // コンソール出力
    System.out.println("data = " + data);
  }
}

public class Program {
  // 実行関数
  public static void main(String... args) {
    Gson gson = new Gson();
    // redis接続する。
    try (var pool = new JedisPool("192.168.1.200", Protocol.DEFAULT_PORT)) {
      // Resource取得する。(これがPoolのインスタンスを生成する時に接続するか、Resource取得する時に接続するかの明確な説明がない)
      try (var jedis = pool.getResource()) {
        // Redisデータベースからnodeキーでデータを取得する。
        var data = jedis.get("node");
        // jsonのStringタイプのデータをnodeに変換
        var node = gson.fromJson(data, Node.class);
        // print関数実行
        node.print();
      }
    }
  }
}


Redisデータベースにnodeキーでjsonのstringタイプのデータを取得します。

そしてデータをGsonライブラリ利用してNodeクラスで変換します。そしてprint関数を呼び出すと入力したHello world値が出力しました。


次はRedisで使えるListとMap、SortedSetのデータタイプです。

import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;

public class Program {
  // 実行関数
  public static void main(String... args) {
    // redis接続する。
    try (var pool = new JedisPool("192.168.1.200", Protocol.DEFAULT_PORT)) {
      // Resource取得する。(これがPoolのインスタンスを生成する時に接続するか、Resource取得する時に接続するかの明確な説明がない)
      try (var jedis = pool.getResource()) {
        // Listタイプの右からPush
        jedis.rpush("list", "1");
        // Listタイプの左からPush
        jedis.lpush("list", "2");
        // 2, 1
        // コンソール出力
        System.out.println(jedis.lpop("list"));
        System.out.println(jedis.lpop("list"));
        // 改行
        System.out.println();

        // Hashタイプのkey-value値を入力
        jedis.hset("map", "a", "1");
        jedis.hset("map", "b", "2");
        jedis.hset("map", "c", "3");

        // 改行
        System.out.println(jedis.hget("map", "b"));
        // 改行
        System.out.println();
        // SortedSetタイプの値を入力
        jedis.zadd("SortedSet", 1, "aaa");
        jedis.zadd("SortedSet", 0, "bbb");
        // sortして出力
        for (var sort : jedis.zscan("SortedSet", "").getResult()) {
          // コンソール出力
          System.out.println(sort.getElement());
        }
      }
    }
  }
}


上はRedisでlistとmap、SortedSetで使えるタイプです。


実は私はよく使わないタイプです。

Redisプログラムのアルゴリズムが悪く思わないですが、Redisデータベースの性能に関するボトルネックやアルゴリズムの性能がC#の基本ListやDictionaryよりもっと良いと思わないので、可能ならデータをそのままに取得してプログラム内で処理することをよく使います。

私がまだ、Redisの経験が多くないので正確に分かりないですね。


ここまでJavaでRedisデータベースを接続して使い方(Jedisライブラリ)に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿