Redis как Hibernate кэш второго уровня - PullRequest
21 голосов
/ 04 октября 2011

У меня есть сумасшедшая идея: использовать Redis в качестве второго уровня кэширования в спящем режиме.Redis - это хранилище данных в памяти, оно поддерживает репликацию, конвейер и т.д.Основная реализация должна состоять в том, чтобы разделить ключ и значение объекта кэша Hibernate и сохранить все в базе данных Redis.Что вы думаете об этой идее?

С уважением,

Юлий

Ответы [ 6 ]

19 голосов
/ 28 августа 2013

Я сделал Hibernate 2-го уровня кеша с Redis

проверьте это!

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

3 голосов
/ 29 июля 2013

Только что нашел проект 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 голосов
/ 05 октября 2011

Я думаю, что это крутая идея.Вот некоторый код , с которого можно начать

Например, в Grails Redis - это подключаемый бэкэнд вместо Hibernate, и если вам не нужна эта сложность Hibernate,Я думаю, что instead будет верным путем.

Но иметь возможность хранить эти объекты Hibernate в Redis (например, через JRedis ) также было бы неплохо, если бы действительно требовалась сложность (Hibernate).

1 голос
/ 02 января 2019

Среда Redisson реализует Hibernate Cache на основе Redis.Он поддерживает Hibernate 5.3 и 5.4.

Более подробную информацию см. В документации .

1 голос
/ 12 января 2013

Я думаю, что ваша идея великолепна.
Я видел спящий провайдер кэша 2-го уровня для memcached .Может быть, это может помочь вам (например, получить некоторые идеи для работы с Redis?)
Буду признателен, если вы можете открыть эту работу с открытым исходным кодом на github или googlecode или любом другом месте.

0 голосов
/ 15 февраля 2019

Я использовал 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);

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...