【Java】Spring Data Redisを試す
実行環境
Spring Data Redisとは
IntellijでSpring Data Redisの公式チュートリアルを試す
1. Redisをインストールする
以下を参考にインストール(バージョン3.0.504)、Redisサーバを起動する
2. Spring Initializrからアプリの雛型(zipファイル)をダウンロードする
3. zipファイルを解凍し、Intellijにインポートする
4. 必要なファイルを作成する
以下のファイルをチュートリアルのコードをコピーして作成する。
- src/main/java/com/example/messagingredis/Receiver.java
- src/main/java/com/example/messagingredis/MessagingRedisApplication.java
5. プログラムを実行する
MessagingRedisApplicationを右クリックし、「Run 'MessagingRedis...Main()'」をクリックする
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操作を試す
基本は上記のサイト通りだが、いくつか上手くいかなかった箇所がある。
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>
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>