【Java】Spring Data Redisを試す

実行環境

Spring Data Redisとは

spring.pleiades.io

IntellijでSpring Data Redisの公式チュートリアルを試す

spring.pleiades.io

1. Redisをインストールする

以下を参考にインストール(バージョン3.0.504)、Redisサーバを起動する

www.purin-it.com

2. Spring Initializrからアプリの雛型(zipファイル)をダウンロードする

https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.5.5&packaging=jar&jvmVersion=11&groupId=com.example&artifactId=messaging-redis&name=messaging-redis&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.messaging-redis&dependencies=data-redis

f:id:stmtk358:20211113083922p:plain

3. zipファイルを解凍し、Intellijにインポートする

f:id:stmtk358:20211113084105p:plain

f:id:stmtk358:20211113084225p:plain

f:id:stmtk358:20211113084314p:plain

4. 必要なファイルを作成する

以下のファイルをチュートリアルのコードをコピーして作成する。

  • src/main/java/com/example/messagingredis/Receiver.java
  • src/main/java/com/example/messagingredis/MessagingRedisApplication.java

5. プログラムを実行する

MessagingRedisApplicationを右クリックし、「Run 'MessagingRedis...Main()'」をクリックする

f:id:stmtk358:20211113084534p:plain

2021-11-13 08:45:07.365  INFO 4268 --- [           main] c.e.m.MessagingRedisApplication          : Started MessagingRedisApplication in 2.09 seconds (JVM running for 2.506)
2021-11-13 08:45:07.366  INFO 4268 --- [           main] c.e.m.MessagingRedisApplication          : Sending message...
2021-11-13 08:45:07.384  INFO 4268 --- [    container-2] com.example.messagingredis.Receiver      : Received <Hello from Redis!>

RedisのCRUD操作を試す

frontbackend.com

基本は上記のサイト通りだが、いくつか上手くいかなかった箇所がある。

pom.xml

実行時に以下のエラーになる場合がある。

Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    ... 99 more
Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.JedisPoolConfig
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    ... 99 more

その場合はpom.xmlに「commons-pool2」「jedis」を追加する。

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
    </dependencies>

www.netsurfingzone.com

application.properties

spring.redis.xxxになってる箇所をredis.xxxに修正する。

RedisConfiguration.java

パスワードを設定していない場合は以下のエラーになる。

Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
    at redis.clients.jedis.Protocol.processError(Protocol.java:135)
    at redis.clients.jedis.Protocol.process(Protocol.java:169)
    at redis.clients.jedis.Protocol.read(Protocol.java:223)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:352)
    at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:270)
    at redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2717)
    at redis.clients.jedis.BinaryJedis.initializeFromClientConfig(BinaryJedis.java:94)
    at redis.clients.jedis.BinaryJedis.<init>(BinaryJedis.java:82)
    at redis.clients.jedis.Jedis.<init>(Jedis.java:54)
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.createJedis(JedisConnectionFactory.java:302)
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:286)
    ... 111 more

その場合はパスワードの設定をコメントアウトする。

//        redisStandaloneConfiguration.setPassword(password);

Application.java

ApplicationクラスはSpring InitializrのデフォルトでOK。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

UserSessionRepositoryTest.java

テストクラスはこんな感じ。

@SpringBootTest
public class UserSessionRepositoryTest {

    @Autowired
    private UserSessionRepository userSessionRepository;

    @BeforeEach
    public void setUp() {
        userSessionRepository.deleteAll();
    }

    @Test
    public void shouldSaveUserSession() {
        ~省略~
    }
}

Redisの値確認

shouldFindAllUserSessionObjects()テスト実行後のRedisの値を確認する。

PS C:\Program Files\Redis> .\redis-cli.exe keys *
1) "Session:05e83de1-415e-4878-a775-c98c26d224f7"
2) "Session:f53065ec-e676-44b1-b308-f03cf2505e35"
3) "Session"
PS C:\Program Files\Redis> .\redis-cli.exe hgetall "Session:05e83de1-415e-4878-a775-c98c26d224f7"
 1) "_class"
 2) "com.example.rediscrud.UserSession"
 3) "browser"
 4) "Chrome"
 5) "id"
 6) "05e83de1-415e-4878-a775-c98c26d224f7"
 7) "loginTime"
 8) "1636860221584"
 9) "username"
10) "USER_1"
PS C:\Program Files\Redis> .\redis-cli.exe hgetall "Session:f53065ec-e676-44b1-b308-f03cf2505e35"
 1) "_class"
 2) "com.example.rediscrud.UserSession"
 3) "browser"
 4) "IE"
 5) "id"
 6) "f53065ec-e676-44b1-b308-f03cf2505e35"
 7) "loginTime"
 8) "1636860221584"
 9) "username"
10) "USER_2"
PS C:\Program Files\Redis>

参考文献

spring.pleiades.io

spring.pleiades.io

www.purin-it.com

frontbackend.com

www.netsurfingzone.com

blog.eiel.info