Redis作为Hibernate二级缓存

时间:2011-10-04 15:14:51

标签: hibernate caching redis nosql

我有一个疯狂的想法:使用Redis作为休眠第二个缓存级别。 Redis是一个内存数据存储区,它支持复制,管道等。目标是在许多tomcat节点之间共享hibernate缓存。基本实现应该是将Hibernate缓存对象键和值进行搜索并将所有内容存储到Redis数据库中。你怎么看待这个想法?

致以最诚挚的问候,

朱利

6 个答案:

答案 0 :(得分:19)

我使用Redis

制作了Hibernate二级缓存 检查它!

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

答案 1 :(得分:3)

刚刚找到了一个github项目。 https://github.com/debop/hibernate-redis 我认为它已经完成了。它缺少一些文档。 编辑:刚刚找到了更好的存储库,文档更好。 https://github.com/Jongtae/hibernate-redis

在构建并将库导入项目之后,它就像任何二级缓存一样简单。

<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会话管理器。

答案 2 :(得分:2)

我认为这是一个很酷的主意。这是some code让您入门

例如,在Grails中,Redis是一个可插件的后端而不是的Hibernate,除非你真的需要Hibernate的复杂性,否则我认为instead是正确的方法。

但是如果真的需要(Hibernate)复杂性,那么有能力将这些Hibernate实体保留在Redis中(例如通过JRedis)也会很好。

答案 3 :(得分:1)

我认为你的想法很棒。
我看到了一个休眠2nd level cache provider for memcached。也许它也可以帮助你(即 - 从redis中获取一些想法吗?)
如果你能在github或googlecode或任何其他地方开源这项工作,我将不胜感激。

答案 4 :(得分:1)

Redisson框架实现基于Redis的Hibernate Cache。它支持Hibernate 5.3和5.4。

有关更多详细信息,请参阅documentation

答案 5 :(得分:0)

我将Redisson与Springboot一起使用,并且配置非常容易。

只需添加以下内容:

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

    }

}