SlideShare a Scribd company logo
Spring Framework / Boot / Data 徹底活用
August 28, 2015
Spring in Summer 夏なのにSpring
!
Naohiro Yoshida
Recruit Technologies Co.,Ltd.
∼Spring Data Redis 編∼
自己紹介
(def	
  me	
  {:name	
  "吉田	
  尚弘"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  :job	
  "アーキテクト"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  :lang	
  ["Java"	
  "Clojure"	
  "Scala"	
  "golang"]	
  
     :spring-­‐use	
  {"流通系企業基幹システム"	
  
	
   	
   	
   	
   	
   	
   	
   	
   	
   	
  	
  	
  	
  "高校生向け学習アプリAPIサーバ"})
リクルートにおけるSpringへの取り組み
■ リクルートでは全社標準FWとしてSpringの採用を決定
■ 専門部隊で検証やサイトへの適用を進めている
学んだプラクティスについては随時ブログや勉強会等で公開予定
!
!
!
!
!
!
API/バックエンド
Spring Boot
Spring Framework
Spring XXX 独自LIB
!
フロントエンド
node.js
!
!
!
!
!
!
!
!
!
API/バックエンド
本日の内容
Spring BootでのSpring Data Redisの使い方と

プラクティス
Spring Boot
Spring Framework
Spring Rabbit
Spring Boot
Autoconfigure
Spring JMS
Spring Boot
Actuator
Spring Data
Redis
Spring Data
Elasticsearch
Spring ・・・
Spring Data Redis
■ SpringでRedisを操作するためのライブラリ
■ JedisのローレベルAPIを使うのではなく利用しやすいTemplateを提供している
!
@Autowired	
private RedisTemplate<Object, Object> redisTemplate;	
!
public void access() {	
	 // value	
redisTemplate.opsForValue().set(key, System.currentTimeMillis());	
Object value = redisWriterTemplate.opsForValue().get(key);	
	
// list 	
redisTemplate.opsForList().rightPush(key, value);	
value = redisWriterTemplate.opsForList().leftPop(key);	
	
// expire	
Date expireAt = DateUtils.addHours(dateSupplier.get(), 1);	
redisTemplate.expireAt(key, expireAt);	
}!
Spring Data Redis ∼Cache利用∼
■ RedisCacheManagerを利用することでspring-contextのCache機構と連携可
@Configuration	
@EnableCaching	
public class RedisConfiguration extends CachingConfigurerSupport {	
!
@Bean	
@Autowired	
public CacheManager cacheManager(	
	 	 	 	 	 	 RedisTemplate<Object,Object> redisTemplate){	
	
RedisCacheManager manager = new RedisCacheManager(redisTemplate);	
!
//有効期限設定 (not required)	
Map<String, Long> expires = new HashMap<String, Long>(); 	
expires.put("cache.expire.180", new Long(3 * 60));	
manager.setExpires(expires);	
return manager; 	
}	
}
Spring Data Redis ∼Cache利用∼
// RedisCacheManagerで指定したexpiresのkeyをvalue属性に	
 // 指定することにより有効期限が設定される、expiresにないvalue属性の場合は無期限	
@Override	
@Cacheable(value = "cache.expire.180", key = "'cache.master.seatTypes'")	
public List<CodeAndName> selectSeatTypes() {	
return selectList("sqlfilename");	
}	
!
// この場合redisでのkeyは	
//「cache.master.selectRailroad/ + 引数のrailroadCode値」	
@Cacheable(value = "cache.permanent.selectRailroad",	
key = "'cache.master.selectRailroad/' + #railroadCode")	
public CodeAndName selectRailroad(String railroadCode) {	
return selectOne("sqlfilename", railroadCode);	
}	
■ キャッシュとして戻り値を保持したいメソッドにCachableアノテーションを定義
■ Redisに存在しない場合のみメソッドの中身が呼び出される
■ 下のコードはSQL実行結果をキャッシュとしてRedisに乗せる例
Spring Boot Application
Spring Bootで利用するには
■ spring-boot-starter-redisとspring-boot-autoconfigureを依存関係に追加するだけ
■ RedisAutoConfigurationがRedisTemplate作成する
■ とりあえず使ってみるのは非常に簡単
Jedis
RedisTemplate
アプリケーションコード
Redis
Properties
RedisAuto
Configuration
Redis
spring:	
data:	
redis:	
host: localhost	
port: 6379 	
pool:	
	 	 	 max-active:20
application.yml
これだけでは実用には耐えられない
Redisの構成の選択肢 ∼Redis Cluster∼
■ 擬似的なMulti Master構成、最低3台のMaster Nodeが必要
■ データがシャーディングされNode毎に別のデータを保持
■ 可用性をちゃんと考慮すると6台のNodeが必要
Node1
!① ⑦ ⑨
Node2
!② ③ ⑥
Node 3
!④ ⑤ ⑧ 
それぞれ管理しているhash
slotを教え合っている
Node1
Slave
Node2
Slave
Node3
Slave
Client
1.CLUSTER
HINTS
2.hash slotと

nodeの対応
3.対象ノードからGET
Node 1 Node 2 Node 3
Redisの構成の選択肢 ∼Redis Sentinel∼
■ Master判定専用のプロセス(sentinel)を用いたMaster/Slave構成
■ 複数のsentinelによる投票によりMasterが決定される(複数クラスタ管理可)
■ 多数決によるMaster障害検知なので3台は必要
Redis
Master
Redis
Slave #1
Redis
Slave #2
Sentinel1 sentinel2 sentinel3
Client
1.Master
問い合わせ
2.Master Node
の場所返却
3.データSET
Redisの構成の選択肢 ∼Load Balancer∼
!
Load Balancer
VIP1 VIP 2
Redis
Master
Redis
Slave #2
Redis
Slave #1
■ LBにWrite用のVIPとRead用のVIPを用意
■ クライアントからはVIPにアクセスしノードダウン/Master昇格を意識しない
■ Master 1台 / Slave 1台でも構成可能
Client
SET GET
Sentinel1 sentinel2 sentinel3
Master障害検知と
昇格の1手段として
バックエンドで
sentinelを利用する
Springから使ってみる
Spring + Redis Cluster
■ Jedis 2.7.2からRedis Clusterにも安定版のRedis 3.0.Xに対応している
■ しかし現在Spring Data RedisはRedis Clusterに対応していない
Spring Boot Application
Spring + Redis Sentinel
RedisTemplate
Jedis Sentinel Pool
JedisConnectionFactory
Jedis Pool
sentinel1 sentinel2
sentinel3
Redis
Master
■ JedisSentinelPoolがsentinelプロセスからMasterのHostAndPort取得
■ MasterのHost And Portを取得してMasterに接続
全sentinelから定期的に
Maserの情報を取得
Maserに対してアクセス
Spring Boot Application
Spring + Redis Sentinel Master 判定
JedisSentinelPool
JedisConnectionFactory
■ 起動時にSentinelに対する専用のListenerを生成してMasterのAddrを取得
■ SentinelからのMaster変更を検知する毎にメモリ内のMasterのAddrを変更
■ 起動時に最低1つのsentinelにアクセスできる必要がある
Master
Listener
Master
Listener
Sentinel1 Sentinel2 Sentinel3
Master
Listener
Sentinelに対してsubscribe処理
Master情報を受け取る
Sentinel数分のMasterListenerを
それぞれ別スレッドで起動。
最初にget-master-addr-by-name
でsentinelから直接masterの
Host/Portを取得。ここで取得で
きないと無限ループ
Spring Boot Applicaton起動時
■ Master判定された後はsentinelから切断された場合でも暫定的に利用可
■ Masterが切り替わった時にはWriteが失敗する
■ sentinel復旧後は自動的に再接続
Spring + Redis Sentinel Sentinel停止
Spring Boot Application
Redis Template
JedisSentinelPool
JedisConnectionFactory
JedisPool
Redis
Master
MasterListenerが
デフォルトで5秒に
一回接続試行
Master
Listener
Master
Listener
Master
Listener
Sentinel1 Sentinel2 Sentinel3
Spring Boot Application
RedisTemplate
JedisConnectionFactory
JedisPool
Redis
Master
■ Slave用のJedisConnectionFactoryを用意する必要がある。
■ Slaveが複数になった場合の分散や生死状態の判定は別途仕組みが必要。
JedisConnection
JedisPool
Redis
Slave
Spring + Redis Sentinel Slaveへのアクセス
Jedis Sentinel Pool
sentinel1 sentinel2
sentinel3
ReadかWriteかに
よって利用する
ConnectionFactory
を切り替える
Spring Boot Application
Spring + VIP
JedisConnectionFactory
JedisPool
Redis
Master
Redis
Slave #1
Redis
Slave #2
Load Balancer
VIP1 VIP 2
RedisTemplate
JedisConnectionFactory
JedisPool
■ 死活監視やアクセス分散をLBに委譲する
■ 読取用と書込用のJedisConnectionFactoryはそれぞれ必要
キャッシュ用クラスタ
■ 複数Master/Slaveのクラスタ構成もRepository層以上からは透過
■ 将来的なRedis Clusterへの移行時の影響を低減
■ 標準では対応していないので拡張が必要 -> 現在RTCで開発中
Spring Boot Application
Master Slave #1 Slave #2
RedisTemplate
JedisConnection
Factory
JedisConnection
Factory
JedisConnection
Factory
JedisConnection
Factory
Load Balancer
VIP1 VIP 2 VIP 3 VIP 4
Master Slave #1 Slave #2
一時データ用クラスタ
・キーのprefixなどでクラスタ判定
・発行コマンドでWrite/Read判定
Spring + VIP Multiple JedisConnectionFactory
まとめ
■ Spring Data RedisのRedisTemplateによりRedis操作は簡単
■ Spring Data RedisでのRedis Clusterは直接サポートされていない
■ 実運用に耐えるRedis構成に合わせるとある程度のカスタマイズが必要

More Related Content

PPTX
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
PDF
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
PDF
会社でClojure使ってみて分かったこと
PDF
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
PDF
ビッグじゃなくても使えるSpark Streaming
PDF
Sbtのマルチプロジェクトはいいぞ
PPTX
Elasticsearch 5.2とJava Clientで戯れる #elasticsearchjp
PDF
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
会社でClojure使ってみて分かったこと
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
ビッグじゃなくても使えるSpark Streaming
Sbtのマルチプロジェクトはいいぞ
Elasticsearch 5.2とJava Clientで戯れる #elasticsearchjp
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"

What's hot (20)

PDF
Azure &lt;3 Openness
PDF
Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
PDF
Infrastructure as Codeの取り組みと改善
PDF
Spring I/O 2017 報告 ThymeleafのWebFlux対応
PDF
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
PDF
Terraform Bootcamp - Azure Infrastructure as Code隊
PDF
Azure How to Learn & ゆるふわ雑談Q&A
PDF
GCP vs 他社クラウド
PDF
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
PPTX
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
PDF
コンテナ時代にインフラエンジニアは何をするのか
PDF
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
PDF
Quarkus による超音速な Spring アプリケーション開発
PPTX
Spring I/O 2015 報告
PDF
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
PDF
ScalaでDSP作ってみた
PDF
sbtマルチプロジェクトビルドの使いどころ
PPTX
Swagger jjug ccc 2018 spring
ODP
Zabbix study
Azure &lt;3 Openness
Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Infrastructure as Codeの取り組みと改善
Spring I/O 2017 報告 ThymeleafのWebFlux対応
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
Terraform Bootcamp - Azure Infrastructure as Code隊
Azure How to Learn & ゆるふわ雑談Q&A
GCP vs 他社クラウド
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
Spark Streamingを使ってみた ~Twitterリアルタイムトレンドランキング~
コンテナ時代にインフラエンジニアは何をするのか
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
Quarkus による超音速な Spring アプリケーション開発
Spring I/O 2015 報告
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
ScalaでDSP作ってみた
sbtマルチプロジェクトビルドの使いどころ
Swagger jjug ccc 2018 spring
Zabbix study
Ad

Similar to Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜 (20)

PPT
Springでdao 20070413
PPTX
Reladomo in Scala #scala_ks
PPTX
エンタープライズ分野での実践AngularJS
PPTX
20170422 azure portal cli 使いこなし
PPTX
Spring data-rest-and-spring-cloud-contract
PDF
データマイニング+WEB勉強会資料第6回
PPT
Spring3.1概要 データアクセスとトランザクション処理
PDF
SPARQLとMashup環境 (年岡先生)
PDF
Retina対応 CSSスプライトを自動化しよう sprity版(東区フロントエンド勉強会 2015年 第2回) 補足資料
PDF
Head toward Java 16 (Night Seminar Edition)
PPTX
20141017 introduce razor
PDF
Node.js勉強会 Framework Koa
PDF
React Native GUIDE
PDF
C base design methodology with s dx and xilinx ml
PDF
scala+liftで遊ぼう
PDF
9/16 Tokyo Apache Drill Meetup - drill vs sparksql
PDF
Python / R で使うSAS Viya
PDF
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
PDF
社内勉強会資料(Varnish Module)
PPTX
Telemetryについて
Springでdao 20070413
Reladomo in Scala #scala_ks
エンタープライズ分野での実践AngularJS
20170422 azure portal cli 使いこなし
Spring data-rest-and-spring-cloud-contract
データマイニング+WEB勉強会資料第6回
Spring3.1概要 データアクセスとトランザクション処理
SPARQLとMashup環境 (年岡先生)
Retina対応 CSSスプライトを自動化しよう sprity版(東区フロントエンド勉強会 2015年 第2回) 補足資料
Head toward Java 16 (Night Seminar Edition)
20141017 introduce razor
Node.js勉強会 Framework Koa
React Native GUIDE
C base design methodology with s dx and xilinx ml
scala+liftで遊ぼう
9/16 Tokyo Apache Drill Meetup - drill vs sparksql
Python / R で使うSAS Viya
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
社内勉強会資料(Varnish Module)
Telemetryについて
Ad

Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜