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 型のスコアが関連付けられる |
保存構造のイメージ:

よく使うコマンド
- String 操作コマンド
| コマンド | 説明 |
|---|---|
| SET key value | 指定 key の値を設定する |
| GET key | 指定 key の値を取得する |
| SETEX key seconds value | key の値を設定し、key の有効期限を seconds 秒に設定する |
| SETNX key value | key が存在しない場合だけ key の値を設定する。存在する場合は何もしない |
- hash 操作コマンド
| コマンド | 説明 |
|---|---|
| HSET key field value | key 内の field の値を value に設定する |
| HGET key field | ハッシュテーブル内の指定フィールドの値を取得する |
| HDEL key field | ハッシュテーブル内の指定フィールドを削除する |
| HKEYS key | ハッシュテーブル内のすべてのフィールドを取得する |
| HVALS key | ハッシュテーブル内のすべての値を取得する |
| HGETALL key | ハッシュテーブル内の指定 key のすべてのフィールドと値を取得する |
- List 操作コマンド
| コマンド | 説明 |
|---|---|
| LPUSH key value1 [value2] | 一つまたは複数の値をリストの先頭に挿入する |
| LRANGE key start stop | リストの指定範囲内の要素を取得する |
| RPOP key | リストの最後の要素を削除し、取得する |
| LLEN key | リストの長さを取得する |
| BRPOP key1 [key2] timeout |
- set 操作コマンド
| コマンド | 説明 |
|---|---|
| SADD key member1 [member2] | 集合に一つまたは複数のメンバーを追加する |
| SMEMBERS key | 集合内のすべてのメンバーを返す |
| SCARD key | 集合のメンバー数を取得する |
| SINTER key1 [key2] | 指定したすべての集合の積集合を返す |
| SUNION key1 [key2] | 指定したすべての集合の和集合を返す |
| SDIFF key1 [key2] | 指定したすべての集合の差集合を返す |
| SREM key member1 [member2] | 集合から一つまたは複数のメンバーを削除する |
- Zset 操作コマンド
| コマンド | 説明 |
|---|---|
| ZADD key score1 member1 [score2 member2] | 順序付き集合に一つまたは複数のメンバーを追加する |
| ZRANGE key start stop [WITHSCORES] | インデックス範囲によって、順序付き集合内の指定区間のメンバーを返す |
| ZINCRBY key increament member | 順序付き集合内の指定メンバーのスコアに increament を加算する |
| ZREM key member [member] | 順序付き集合から一つまたは複数のメンバーを削除する |
- 共通コマンド
| コマンド | 説明 |
|---|---|
| KEYS pattern | 指定したパターンに一致するすべての key を探す |
| EXISTS key | 指定した key が存在するかを確認する |
| TYPE key | key に保存されている値の型を返す |
| TTL key | 指定 key の残り生存時間(TTL、time to live)を秒単位で返す |
| DEL key | key が存在する場合、その key を削除する |
Java で Redis を操作する
現在、多くのプロジェクトは Spring Boot をもとに開発されています。Spring は Redis の操作方式を統合し、Spring Data Redis を提供して Redis 操作を簡単にしています。
Step 1:座標を導入する
<dependency>
<groupld>org.springframework.boot</groupld>
<artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>Step 2:yml で Redis を設定する
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() |
| SetOperations | set 型データ操作 | opsForSet() |
| ZSetOperations | zset 型データ操作 | opsForZSet() |
| HashOperations | map 型データ操作 | opsForHash() |
| ListOperations | List 型データ操作 | opsForList() |
Test クラスで RedisTemplate オブジェクトを注入し、このオブジェクトで Redis を操作します。
例:String 型データを追加する。key は name、value は zhangsan。
@SpringBootTest
@RunWith(SptingRunner.class)
public class Test{
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testString(){
//文字列nameを追加する
redisTemplate.opsForValue().set("name","zhangsan");
}
}シリアライズ方式をカスタマイズする
RedisTemplate はデフォルトで key をシリアライズして保存します。シリアライズ方式を変更したい場合は、設定クラスを作成します。
@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;
}
}この設定クラスにより、RedisTemplate の key シリアライズ方式を StringRedisSerializer に変更できます。これにより、文字列型の key を扱いやすくなります。また、必要に応じて value のシリアライズ方式も変更でき、さまざまなデータ保存要件に対応できます。
その他の操作例
文字列型データの追加以外にも、RedisTemplate で他の型のデータを操作できます。
Set 型データを追加する
@Test
public void testSet() {
redisTemplate.opsForSet().add("mySet", "value1", "value2", "value3");
}ZSet 型データを追加する
@Test
public void testZSet() {
redisTemplate.opsForZSet().add("myZSet", "member1", 1.0);
redisTemplate.opsForZSet().add("myZSet", "member2", 2.0);
}Hash 型データを追加する
@Test
public void testHash() {
redisTemplate.opsForHash().put("myHash", "field1", "value1");
redisTemplate.opsForHash().put("myHash", "field2", "value2");
}List 型データを追加する
@Test
public void testList() {
redisTemplate.opsForList().leftPush("myList", "element1");
redisTemplate.opsForList().leftPush("myList", "element2");
}データ読み取り操作
RedisTemplate を使って、Redis に保存されたデータを読み取ることもできます。
文字列型データを読み取る
@Test
public void testGetString() {
Object value = redisTemplate.opsForValue().get("name");
System.out.println("Value for key 'name': " + value);
}Set 型データを読み取る
@Test
public void testGetSet() {
Set<Object> setValues = redisTemplate.opsForSet().members("mySet");
System.out.println("Values in set 'mySet': " + setValues);
}ZSet 型データを読み取る
@Test
public void testGetZSet() {
Set<Object> zSetValues = redisTemplate.opsForZSet().range("myZSet", 0, -1);
System.out.println("Values in zset 'myZSet': " + zSetValues);
}Hash 型データを読み取る
@Test
public void testGetHash() {
Object hashValue = redisTemplate.opsForHash().get("myHash", "field1");
System.out.println("Value for field 'field1' in hash 'myHash': " + hashValue);
}List 型データを読み取る
@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 の機能を拡張、カスタマイズすれば、より複雑な業務場面にも対応できます。
