我们日常在使用redis的时候, 有时会碰到大Value的问题, 超级大的一个Value存到redis中去, 这样其实不好, 我们可以把value进行压缩.
下面我们使用java自带的压缩, 对字符串进行压缩.
/*** 使用gzip压缩字符串** @param originString 要压缩的字符串* @return 压缩后的字符串*/public static String compress(String originString) {if (originString == null || originString.length() == 0) {return originString;}ByteArrayOutputStream out = new ByteArrayOutputStream();try (GZIPOutputStream gzip = new GZIPOutputStream(out);) {gzip.write(originString.getBytes());} catch (IOException e) {e.printStackTrace();}return new sun.misc.BASE64Encoder().encode(out.toByteArray());}/*** 使用gzip解压缩** @param compressedString 压缩字符串* @return*/public static String uncompress(String compressedString) {if (compressedString == null || compressedString.length() == 0) {return null;}ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] compressedByte = new byte[0];try {compressedByte = new sun.misc.BASE64Decoder().decodeBuffer(compressedString);} catch (IOException e) {e.printStackTrace();}String originString = null;try (ByteArrayInputStream in = new ByteArrayInputStream(compressedByte);GZIPInputStream ginzip = new GZIPInputStream(in);) {byte[] buffer = new byte[1024];int offset = -1;while ((offset = ginzip.read(buffer)) != -1) {out.write(buffer, 0, offset);}originString = out.toString();} catch (IOException e) {e.printStackTrace();}return originString;}
测试方法:
public static void main(String[] args) {String compress = compress("parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@68dc098b\n" +"2020-10-27 17:53:22,377 [] [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate -TID: N/A - Multiple Spring Data modules found, entering strict repository configuration mode!\n" +"2020-10-27 17:53:22,751 [] [main] WARN org.springframework.context.annotation.ConfigurationClassPostProcessor -TID: N/A - Cannot enhance @Configuration bean definition 'com.ctrip.framework.apollo.spring.boot.ApolloAutoConfiguration' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.\n" +"2020-10-27 17:53:23,043 [] [main] INFO org.springframework.cloud.context.scope.GenericScope -TID: N/A - BeanFactory id=96a1a9f4-ca0a-3f29-9933-63914650547a\n" +"2020-10-27 17:53:23,103 [] [main] INFO o.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor -TID: N/A - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring\n" +"2020-10-27 17:53:23,141 [] [main] WARN o.s.boot.context.properties.ConfigurationPropertiesBindingPostProcessor -TID: N/A - Multiple PropertySourcesPlaceholderConfigurer beans registered [propertySourcesPlaceholderConfigurer, org.springframework.context.support.PropertySourcesPlaceholderConfigurer], falling back to Environment\n" +"2020-10-27 17:53:23,173 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.customer.ActUserFollowService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,175 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.customer.CueManagementService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,178 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.customer.CustomerDemandSolutionServiceV2' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,181 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.customer.CustomerFollowUpTaskService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,183 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.customer.CustomerService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,186 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.resource.BuildingFloorRoomService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,188 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.resource.BuildingService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n" +"2020-10-27 17:53:23,190 [] [main] INFO o.s.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -TID: N/A - Bean 'com.ydcloud.qurey.customer.feign.resource.ParkProjectService' of type [org.springframework.cloud.netflix.feign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)");System.out.println(compress);String uncompress = uncompress(compress);System.out.println(uncompress);System.out.println(compress.length());System.out.println(uncompress.length());}
运行测试代码, 得到以下结果, 压缩后的字符串长度是: 1252, 原始字符串的长度是: 4515, 有很大的改善效果.