web-dev-qa-db-ja.com

Hibernateの第2レベルのキャッシュとしてRedis

私はクレイジーなアイデアを持っています:Redisを休止状態の2番目のキャッシュレベルとして使用します。 Redisはインメモリデータストアであり、レプリケーション、パイプラインなどをサポートします。目標は、多くのTomcatノード間でHibernateキャッシュを共有することです。基本的な実装は、Hibernateキャッシュオブジェクトのキーと値を固定し、すべてをRedisデータベースに保存することです。その考えについてどう思いますか?

宜しくお願いします、

ジュリアス

24
juliusdev

RedisでHibernateの2次キャッシュを作成しました

確認してください!

https://github.com/debop/hibernate-redis

21
Debop

その上で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セッションマネージャー。

3
digao_mb

Redisson フレームワークはRedisベースのHibernateキャッシュを実装します。 Hibernate5.3および5.4をサポートします。

詳細については、 ドキュメント を参照してください。

3

かっこいいアイデアだと思います。ここに いくつかのコード あなたが始めるために

たとえば、Grailsでは、RedisはHibernateのプラグイン可能なバックエンドではなくであり、Hibernateの複雑さが本当に必要でない限り、insteadだと思います。行く正しい方法でしょう。

ただし、(Hibernate)の複雑さが本当に必要な場合は、これらのHibernateエンティティをRedisに保持する機能(たとえば、 JRedis 経由)も便利です。

2
tolitius

あなたのアイデアは素晴らしいと思います。
休止状態を見ました memcachedの第2レベルのキャッシュプロバイダー 。多分それはあなたにも役立つかもしれません(つまり、redisを操作するためのアイデアをそこから得ることができますか?)
この作品をgithub、googlecode、またはその他の場所でオープンソース化していただければ幸いです。

1
Yair Zaslavsky

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);

    }

}
0
Ronny Shibley