Skip to content

Redis

Redis の概念

Redis は、メモリ上の key-value データ構造をもとにしたストレージシステムです。よく、データベース、キャッシュ、メッセージミドルウェアとして使われます。
構造化された NoSQL データベース、つまり非リレーショナルデータベースとも呼ばれます。

よく使われるリレーショナルデータベース(RDBMS):Mysql、Oracle、DB2、SQLServer

非リレーショナルデータベース(NoSQL):Redis、MongoDB、MemCached

説明:

RDBMS はリレーショナルモデルをもとに作られ、複数の表が互いに接続された二次元テーブルで構成されます。
表で構成されていないデータベースは、非リレーショナルデータベースと呼ばれます。

使用場面:

キャッシュ、タスクキュー、メッセージキュー、分散ロック。

特徴:

  • メモリベースで保存するため、読み書き性能が高い
  • ホットデータの保存に向いている。例:人気商品、情報、ニュース
  • 企業アプリケーションで広く使われる

データ型

Redis が保存するデータは key-value 構造です。key文字列 型で、データvalue に保存されます。したがって、Redis のデータ型とは、実際には value のデータ型を指します。

データ型説明特徴
String通常の文字列。よく使う
hashハッシュテーブルString 型の field と value のマッピング表。オブジェクト保存に向いている
listリスト単純な文字列リスト。挿入順に並び、重複要素を持てる
set無順序集合String 型の無順序集合。メンバーは一意で、重複できない
sorted set / zset順序付き集合。重複要素なしSet と似ているが、各要素に double 型のスコアが関連付けられる

保存構造のイメージ:

Redisデータ構造

よく使うコマンド

  1. String 操作コマンド
コマンド説明
SET key value指定 key の値を設定する
GET key指定 key の値を取得する
SETEX key seconds valuekey の値を設定し、key の有効期限を seconds 秒に設定する
SETNX key valuekey が存在しない場合だけ key の値を設定する。存在する場合は何もしない
  1. hash 操作コマンド
コマンド説明
HSET key field valuekey 内の field の値を value に設定する
HGET key fieldハッシュテーブル内の指定フィールドの値を取得する
HDEL key fieldハッシュテーブル内の指定フィールドを削除する
HKEYS keyハッシュテーブル内のすべてのフィールドを取得する
HVALS keyハッシュテーブル内のすべての値を取得する
HGETALL keyハッシュテーブル内の指定 key のすべてのフィールドと値を取得する
  1. List 操作コマンド
コマンド説明
LPUSH key value1 [value2]一つまたは複数の値をリストの先頭に挿入する
LRANGE key start stopリストの指定範囲内の要素を取得する
RPOP keyリストの最後の要素を削除し、取得する
LLEN keyリストの長さを取得する
BRPOP key1 [key2] timeout
  1. set 操作コマンド
コマンド説明
SADD key member1 [member2]集合に一つまたは複数のメンバーを追加する
SMEMBERS key集合内のすべてのメンバーを返す
SCARD key集合のメンバー数を取得する
SINTER key1 [key2]指定したすべての集合の積集合を返す
SUNION key1 [key2]指定したすべての集合の和集合を返す
SDIFF key1 [key2]指定したすべての集合の差集合を返す
SREM key member1 [member2]集合から一つまたは複数のメンバーを削除する
  1. Zset 操作コマンド
コマンド説明
ZADD key score1 member1 [score2 member2]順序付き集合に一つまたは複数のメンバーを追加する
ZRANGE key start stop [WITHSCORES]インデックス範囲によって、順序付き集合内の指定区間のメンバーを返す
ZINCRBY key increament member順序付き集合内の指定メンバーのスコアに increament を加算する
ZREM key member [member]順序付き集合から一つまたは複数のメンバーを削除する
  1. 共通コマンド
コマンド説明
KEYS pattern指定したパターンに一致するすべての key を探す
EXISTS key指定した key が存在するかを確認する
TYPE keykey に保存されている値の型を返す
TTL key指定 key の残り生存時間(TTL、time to live)を秒単位で返す
DEL keykey が存在する場合、その key を削除する

Java で Redis を操作する

現在、多くのプロジェクトは Spring Boot をもとに開発されています。Spring は Redis の操作方式を統合し、Spring Data Redis を提供して Redis 操作を簡単にしています。

Step 1:座標を導入する

xml
<dependency>
	<groupld>org.springframework.boot</groupld>
	<artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>

Step 2:yml で Redis を設定する

yml
redis:
	host: localhost
	port: 6379
	#操作するデータベース番号を選択する(デフォルトでは15個のデータベースがある)
	database: 0
	jedis:
		#Redis接続プール設定
		oppl:
			max-active: 8 #最大接続数
			max-wait: 1ms #接続プールの最大ブロック待ち時間
			max-idle: 4 #接続プール内の最大アイドル接続数
			min-idle: 0 #接続プール内の最小アイドル接続数

ここでは Redis の接続情報を設定しています。主にホストアドレス、ポート番号、操作するデータベース番号です。さらに、Jedis 接続プールのパラメータも設定し、接続の再利用性と性能を高めます。最大接続数、最大ブロック待ち時間、最大アイドル接続、最小アイドル接続は、実際のアプリケーション要件に応じて調整できます。

Step 3:RedisTemplate で Redis を操作する

Spring Data Redis では、高度にカプセル化された RedisTemplate クラスが提供されています。jedis クライアント内の多くの api を分類してカプセル化し、同じ種類の操作を operation インターフェースとしてまとめています。

分類説明取得方法
ValueOperations単純な K-V 操作opsForValue()
SetOperationsset 型データ操作opsForSet()
ZSetOperationszset 型データ操作opsForZSet()
HashOperationsmap 型データ操作opsForHash()
ListOperationsList 型データ操作opsForList()

Test クラスで RedisTemplate オブジェクトを注入し、このオブジェクトで Redis を操作します。

例:String 型データを追加する。keynamevaluezhangsan

java
@SpringBootTest
@RunWith(SptingRunner.class)
public class Test{
	@Autowired
	private RedisTemplate redisTemplate;

	@Test
	public void testString(){
		//文字列nameを追加する
		redisTemplate.opsForValue().set("name","zhangsan");
	}
}

シリアライズ方式をカスタマイズする

RedisTemplate はデフォルトで key をシリアライズして保存します。シリアライズ方式を変更したい場合は、設定クラスを作成します。

java
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
	
	@Bean
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
	
	RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
	
	//デフォルトのKeyシリアライザーはJdkSerializationRedisserializer
	redisTemplate.setKeySerializer(new StringRedisSerializer());
	redisTemplate.setHashkeySerializer(new StringRedisserializer());
	
	redisTemplate.setConnectionFactory(connectionFactory);
	return redisTemplate;
	}
}

この設定クラスにより、RedisTemplatekey シリアライズ方式を StringRedisSerializer に変更できます。これにより、文字列型の key を扱いやすくなります。また、必要に応じて value のシリアライズ方式も変更でき、さまざまなデータ保存要件に対応できます。

その他の操作例

文字列型データの追加以外にも、RedisTemplate で他の型のデータを操作できます。

Set 型データを追加する

java
@Test
public void testSet() {
    redisTemplate.opsForSet().add("mySet", "value1", "value2", "value3");
}

ZSet 型データを追加する

java
@Test
public void testZSet() {
    redisTemplate.opsForZSet().add("myZSet", "member1", 1.0);
    redisTemplate.opsForZSet().add("myZSet", "member2", 2.0);
}

Hash 型データを追加する

java
@Test
public void testHash() {
    redisTemplate.opsForHash().put("myHash", "field1", "value1");
    redisTemplate.opsForHash().put("myHash", "field2", "value2");
}

List 型データを追加する

java
@Test
public void testList() {
    redisTemplate.opsForList().leftPush("myList", "element1");
    redisTemplate.opsForList().leftPush("myList", "element2");
}

データ読み取り操作

RedisTemplate を使って、Redis に保存されたデータを読み取ることもできます。

文字列型データを読み取る

java
@Test
public void testGetString() {
    Object value = redisTemplate.opsForValue().get("name");
    System.out.println("Value for key 'name': " + value);
}

Set 型データを読み取る

java
@Test
public void testGetSet() {
    Set<Object> setValues = redisTemplate.opsForSet().members("mySet");
    System.out.println("Values in set 'mySet': " + setValues);
}

ZSet 型データを読み取る

java
@Test
public void testGetZSet() {
    Set<Object> zSetValues = redisTemplate.opsForZSet().range("myZSet", 0, -1);
    System.out.println("Values in zset 'myZSet': " + zSetValues);
}

Hash 型データを読み取る

java
@Test
public void testGetHash() {
    Object hashValue = redisTemplate.opsForHash().get("myHash", "field1");
    System.out.println("Value for field 'field1' in hash 'myHash': " + hashValue);
}

List 型データを読み取る

java
@Test
public void testGetList() {
    List<Object> listValues = redisTemplate.opsForList().range("myList", 0, -1);
    System.out.println("Values in list 'myList': " + listValues);
}

これらの操作例から、RedisTemplate はさまざまなデータ型を操作するための豊富なメソッドを提供していることが分かります。Java アプリケーションで Redis を使う作業が、より便利で効率的になります。さらに、実際の要件に応じて RedisTemplate の機能を拡張、カスタマイズすれば、より複雑な業務場面にも対応できます。

Released under the MIT License.