# redis-cache-plus **Repository Path**: zhuoyueland_hone033/redis-cache-plus ## Basic Information - **Project Name**: redis-cache-plus - **Description**: hzero redis缓存翻译增强 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-07-30 - **Last Updated**: 2024-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. # Hzero导出性能提升 ## 业务场景 当导出数据达到10万级别,并且导出的List 中存在大量需要翻译的字段(独立值集,缓存翻译)。 实际业务场景:Object类中总字段有100多个,需要翻译的字段有30多个。此时使用hzero的标准缓存功能会效率特别低,查询时分页响应速度还能接收,当导出时,1000条数据,程序就一直查缓存,最后连接断开。 ## 问题分析 hzero标准功能源码: image-20230210223319121 image-20230210223410093 image-20230210223449332 hzero标准缓存翻译的流程为: 1. aop拦截返回结果集的方法 2. 递归遍历结果集,将所有对象中标记有CacheValue注解的字段都做翻译处理(包括对象中的对象) 3. 拿到字段上配置CacheValue注解信息,通过反射拿到key、primaryKey、searchKey配置的字段的值,并用redisHelper去redis上查出结果,再用反射去将值填入翻译字段。 image-20230210223548172 ## 性能问题 ​ 遍历翻译对象时,一个对象,就需要用反射拿到标有CacheValue注解的字段,再去反射找primaryKey对应的字段的值,再去redis查出翻译结果,也就是说,1000个大小的List (Object有100个字段),会有100\*50\*1000 次查redis缓存(50:为通过遍历Object的字段找primaryKey对应字段,取中间值),并且反射也是耗时的点。 ## 问题解决 1. 对象在循环翻译的时候,哪些字段标记了CacheValue注解总是确定的,可以通过一次初始化,记录Object的**所有字段**的反射Field,将Object中有**哪些字段有缓存注解**,以及**调用的缓存key**有多少个(可能多个字段用同一个key的缓存来翻译)等信息存下来 2. 一次性从缓存中将key直接拿到内存中 3. 遍历结果集做翻译的时候,就可以直接拿到需要翻译的字段Field,并且拿到primaryKey对应的字段,这样就不用循环去找了,减少了反射带来的性能影响。 4. 一次将所有用到的缓存key,都拿到内存中,这样在翻译的之后直接去取对应的就好,不用频繁的取建立redis连接,减少频繁的redis连接带来的性能影响。 ## 思考 ​ 考虑到一般情况页面做查询的时候都会有分页,这时直接通过key,hshkey去拿redis,可以不用拿全量的缓存数据到内存,可以减少内存的压力。 ## 代码 ![image-20230210230111134](README-img/image-20230210230111134.png) 仓库地址:https://gitee.com/q2573722674/redis-cache-plus