hibernate (4.2.x.Final, 4.3.x.Final) 2nd level cache using redis server. with jedis 2.4.1 or higher
reduce cache size by Fast-Serialization and snappy-java. thanks! try serialization benchmark.
Don't use Hibernate 4.3.2.Final, 4.2.9.Final!!! It has bug in CacheKey! Recommend use 4.3.4.Final or 4.2.10.Final
Hibernate 4.3.2.Final CacheKey eliminate entityOrRoleName property for reduce CacheKey size. if multiple entity cached in same region, can't figure out wanted entity.
add dependency
<dependency>
<groupId>com.github.debop</groupId>
<artifactId>hibernate-redis</artifactId>
<version>1.5.9</version>
</dependency>
add repository
<repositories>
<repository>
<id>debop-releases</id>
<url>https://github.com/debop/debop-maven-repo/raw/master/releases</url>
</repository>
<!-- for snapshot -->
<repository>
<id>debop-snapshots</id>
<url>https://github.com/debop/debop-maven-repo/raw/master/snapshots</url>
</repository>
</repositories>
setup hibernate configuration.
// Secondary Cache
props.put(Environment.USE_SECOND_LEVEL_CACHE, true);
props.put(Environment.USE_QUERY_CACHE, true);
props.put(Environment.CACHE_REGION_FACTORY, SingletonRedisRegionFactory.class.getName());
props.put(Environment.CACHE_REGION_PREFIX, "hibernate");
// optional setting for second level cache statistics
props.setProperty(Environment.GENERATE_STATISTICS, "true");
props.setProperty(Environment.USE_STRUCTURED_CACHE, "true");
props.setProperty(Environment.TRANSACTION_STRATEGY, JdbcTransactionFactory.class.getName());
// configuration for Redis that used by hibernate
props.put(Environment.CACHE_PROVIDER_CONFIG, "hibernate-redis.properties");
also same configuration for using Spring Framework or Spring Data JPA
sample for hibernate-redis.properties
##########################################################
#
# properities for hibernate-redis
#
##########################################################
# Redis Server for hibernate 2nd cache
redis.host=localhost
redis.port=6379
# redis.timeout=2000
# redis.password=
# database for hibernate cache
# redis.database=0
redis.database=1
# hiberante 2nd cache default expiry (seconds)
redis.expiryInSeconds=120
# expiry of hibernate.common region (seconds) // hibernate is prefix, region name is common
redis.expiryInSeconds.hibernate.common=0
# expiry of hibernate.account region (seconds) // hibernate is prefix, region name is account
redis.expiryInSeconds.hibernate.account=1200
add @org.hibernate.annotations.Cache annotation to Entity class like this
@Entity
@Cache(region="common", usage = CacheConcurrencyStrategy.READ_WRITE) // or @Cacheable(true) for JPA
@Getter
@Setter
public class Item implements Serializable {
@Id
@GeneratedValue
private Long id;
private String name;
private String description;
private static final long serialVersionUID = -281066218676472922L;
}
run "redis-cli monitor" command in terminal. you can see putting cached items, retrieving cached items.
read HibernateCacheTest.java for more usage.