[Java] Redisデータベースを接続して使い方(Jedisライブラリ)
こんにちは。明月です。
この投稿は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ライブラリ)に関する説明でした。
ご不明なところや間違いところがあればコメントしてください。
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [Java] WebSocketでチャット履歴をローディングする方法2021/06/15 18:34:45
- [Java] WebSocketを利用してユーザ(サイト運用者)が他のユーザとチャットする方法2021/06/15 17:20:08
- [Java] HttpConnectionを利用してウェブページを取得する方法2020/05/20 23:53:24
- [Java] Jsoupを利用してXMLファイル(HTML)を扱う方法2020/05/19 19:32:21
- [Java] 日付フォーマット(SimpleDateFormat)を使う方法2020/03/25 00:36:53
- [Java] サーブレット(Servlet)の環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法2020/03/24 00:48:21
- [Java] Spring環境でファイルアップロード(プログレスバーでファイルアップロード状態を表示する方法)する方法2020/03/22 23:15:12
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07