私はクレイジーなアイデアを持っています:Redisを休止状態の2番目のキャッシュレベルとして使用します。 Redisはインメモリデータストアであり、レプリケーション、パイプラインなどをサポートします。目標は、多くのTomcatノード間でHibernateキャッシュを共有することです。基本的な実装は、Hibernateキャッシュオブジェクトのキーと値を固定し、すべてをRedisデータベースに保存することです。その考えについてどう思いますか?
宜しくお願いします、
ジュリアス
その上でgithubプロジェクトを見つけました。 https://github.com/debop/hibernate-redis すでに完了していると思います。いくつかのドキュメントがありません。 [〜#〜] edit [〜#〜]:より良いドキュメントを備えたより良いリポジトリを見つけました。 https://github.com/Jongtae/hibernate-redis
ライブラリをビルドしてプロジェクトにインポートすると、第2レベルのキャッシュと同じくらい簡単になります。
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.region.factory_class">net.daum.clix.hibernate.redis.RedisRegionFactory
</property>
<property name="redis.Host">"redis.Host"</property>
私が取り組んでいるウェブサイトのいくつかの機能でredisを使用することを考えています。その他の興味深い可能性:分散ロック、Tomcatセッションマネージャー。
あなたのアイデアは素晴らしいと思います。
休止状態を見ました memcachedの第2レベルのキャッシュプロバイダー 。多分それはあなたにも役立つかもしれません(つまり、redisを操作するためのアイデアをそこから得ることができますか?)
この作品をgithub、googlecode、またはその他の場所でオープンソース化していただければ幸いです。
SpringbootでRedissonを使用しましたが、構成は非常に簡単です。
以下を追加するだけです。
implementation 'org.redisson:redisson-spring-boot-starter:3.10.2'
implementation 'org.redisson:redisson-hibernate-53:3.10.2'
application.yml
jpa:
generate-ddl: false
show-sql: false
properties:
hibernate:
ddl-auto: create
dialect: com.codefish.model.hibernate.MySqlDialect
generate_statistics: false
show_sql: false
use_sql_comments: false
format_sql: true
cache:
use_second_level_cache: true
use_query_cache: false
region.factory_class: com.eddress.config.RegionFactory
RedisConfig
@Configuration
public class RedisConfig {
@Value("${spring.redis.master:#{null}}")
public String redisMaster;
@Value("${spring.redis.slave:#{null}}")
public String redisSlave;
@Value("${spring.redis.password:#{null}}")
public String redisPassword;
@Bean
public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
return new RedissonConnectionFactory(redisson);
}
@Bean(destroyMethod = "shutdown")
public RedissonClient redisson() {
return Redisson.create(buildConfigFile(redisMaster,redisSlave, redisPassword));
}
public static Config buildConfigFile(String redisMaster,String redisSlave, String password){
if (Preconditions.isEmpty(redisMaster)) redisMaster = "localhost";
if (Preconditions.isEmpty(password)) password = null;
Config config = new Config().setTransportMode(TransportMode.NIO).setCodec(new SnappyCodecV2());
if (Preconditions.notBlank(redisSlave)){
config.useMasterSlaveServers()
.setMasterAddress("redis://"+redisMaster+":6379")
.addSlaveAddress("redis://"+redisSlave+":6379")
.setPassword(password)
.setIdleConnectionTimeout(10000)
.setTimeout(10000);
}
else{
config.useSingleServer()
.setAddress("redis://"+redisMaster+":6379")
.setPassword(password)
.setIdleConnectionTimeout(10000)
.setTimeout(10000);
}
return config;
}
@Bean
CacheManager cacheManager(RedissonClient redissonClient) {
Map<String, CacheConfig> config = new HashMap<>();
// create "testMap" cache with ttl = 24 minutes and maxIdleTime = 12 minutes
CacheConfig configItem = new CacheConfig(TimeUnit.MINUTES.toMillis(60), TimeUnit.MINUTES.toMillis(30));
config.put("domainCache",configItem);
return new RedissonSpringCacheManager(redissonClient, config);
}
RegionFactory
public class RegionFactory extends org.redisson.hibernate.RedissonRegionFactory {
@Override
protected RedissonClient createRedissonClient(Map properties) {
String master = System.getProperty("REDIS_MASTER");
String slave = System.getProperty("REDIS_SLAVE");
String password = System.getProperty("REDIS_PASSWORD");
Config config = RedisConfig.buildConfigFile(master,slave, password);
return Redisson.create(config);
}
}