以下内容是在github上项目hibernate-redis(https://github.com/debop/hibernate-redis)的基础上做的优化,优化的版本号为1.6.1。关于二级缓存的配置方法和使用方法可以参考github上的项目。
在hibernate二级缓存需要实现的主要接口有:RegionFactory、Region、RegionAccessStrategy。
RegionFactory:根据不同的缓存类型创建不同的Region对象;Region:对应不同的缓存对象,用的最多的还是EntityRegion;RegionAccessStrategy:主要为了根据不同的缓存策略获取不同的缓存对象操作类。关于hibernate二级缓存接口参考:http://my.oschina.net/yybear/blog/102216 。
优化点包括
- 使用公共的redis连接池。hibernate-redis中的redis连接池大小配置写死了,不适合在不同项目场景下的使用;因为项目中已经使用了redis作为缓存服务,并且创建了redis连接池,所以也没有必要为hibernate二级缓存创建新的redis连接池。
- 改用hessian2作为序列化/反序列化工具类。hibernate-redis使用的snappy-java和fast serialization进行序列化/反序列化,序列化后的二进制数据大小比hessian2序列化的数据要大;另,项目环境中也使用了hessian2工具,所以将hibernate-redis的序列化工具类改为hessian2。
- 优化hibernate缓存数据的获取方式。hibernate基于查询的二级缓存,会以查询SQL为key,符合条件的实体id集合为value存放到redis的MAP中存储;当二级缓存命中时,hibernate会根据实体id分别获取对应的缓存数据。如果是基于本机内存的方式存储缓存数据,这种方式获取缓存数据不会有明显的速度问题;但是如果是通过rpc的方式获取缓存数据,数据量稍微大一点(测试中超过100条)获取全部缓存数据的时间就会比较慢,例如共有100条缓存数据,获取一条缓存数据用10ms,获取全部的缓存数据就需要1000ms。优化方式:根据符合条件的实体ID集合进行查询,一次性获取全部的缓存数据,虽然传输的数据量大,但是获取缓存数据的总时间会少很多。实现方式:通过hibernate的属性hibernate.cache.query_cache_factory配置一个新的QueryCacheFactory实现类,hibernate默认的QueryCacheFactory是StandardQueryCacheFactory;通过QueryCacheFactory创建QueryCache,重载get方法。
注:
- hibernate在存储缓存数据之前,将缓存实体类转换为了hashmap。所以序列化/反序列化是对hashmap和byte[]的转换;在反序列化完之后,还需要借助hibernate提供的方法将hashmap转换为相应的的实体对象。
- 附件hibernate-redis-devel.zip为原github项目;hibernate_redis_cache_source.rar为优化之后的源码。
相关推荐
主要介绍了Mybatis-plus基于redis实现二级缓存过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基于springboot最新版本2.1.4.RELEASE,采用jpa为dao层框架,配置redis(redisson)为hibernate的二级缓存。
本项目是基于maven.且需要本地安装了redis之后才能使用,因为项目里面不仅集成了redis,而且里面还集成了shiro。这是从我自己的eclipse中直接copy出来的。实测可用
基于 SpringBoot 从0搭建一个企业级开发项目,基于SpringBoot 的项目,并集成MyBatis-Plus、Redis、Druid、Logback ,并使用 Redis 配置 MyBatis 二级缓存。
第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。 ...
Redis之二级缓存(基于Maven Web项目)
第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。 ...
基于redis的mybatis二级缓存插件简介使用redis作为mybatis的缓存介质,通过使用mybatis的拦截器,在SQL执行的过程中,检查各个Mapper的二级缓存中过期的部分,匹配成功后删除过期的缓存,保证缓存的实时正确性。...
1. BaseCache :为缓存数据最终存储的处类,默认为 PerpetualCache,基于Map存储 2. EvictionCache :当缓存数达到一定
智能缓存介绍基于Ehcache2和Redis的Java分布式二级缓存,除了基本操作外,还可以实现所有级别的多计算机集群的缓存监视和获取。 将独立缓存与特定结构中的Redis缓存系统同步,以实现全局缓存的统一管理。 动态地使用...
基于SpringMVC、Mybatis、Redis、Freemarker的Shiro管理Demo源码的升级版 相关详细配置说明请参看 --> http://www.sojson.com/shiro
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!...
这是一个用于二级缓存的备用缓存模式实现,它确实支持多个缓存节点,所有缓存一种轻量级高性能分布式缓存,基于内存+ Redis构建。 这是用于二级缓存的备用缓存模式实现,它确实支持多个缓存节点,所有缓存节点共享一...
SecondaryCache 基于ehcache、redis实现的二级缓存系统,用akka实现服务器间缓存数据变化后的通信 详细说明见:
为监控而生的分布式多级缓存框架。...一级缓存和二级缓存的数据一致性是通过推和拉两种模式相结合的方式来保证。推主要是基于redis的pub/sub机制,拉主要是基于消息队列和记录消费消息的偏移量来实现的。
介绍ehcache做jvm缓存,ehcache做分布式缓存,redis做分布式缓存,redis分片集群,redis哨兵,redis基本数据,redis主从复制,redis和ehcache的二级缓存,redis雪崩效应,redis缓存穿透(整个环境搭建基于Centos,代码...
主要技术:Netty,Kafka,内存+Redis二级缓存/订阅发布 特点:高性能,高并发,高可用,支持K8S同POD多副本集群部署,横向拓展扩容 测试简介:基于4c8g云虚拟主机,IO密集型机器实测单节点TPS稳定高达13000/s。最长压测时间...
springboot1.x基于spring注解实现J2Cache两级缓存集成,一级缓存:ehcache,二级缓存:redis,代码可直接运行(根据项目中的README.md提示)