当前位置: 首页 > 知识库问答 >
问题:

使用LettuceConnectionFactory向Spring数据Redis添加压缩

林丁雷
2023-03-14

我看到莴苣可以为Redis序列化对象做压缩:https://lettuce.io/core/release/reference/#codecs.compression

有没有办法在Spring Boot Data LettuceConnectionFactory或其他bean中设置此配置?我在这里也看到了这样一个问题:https://github.com/lettuce-io/lettuce-core/issues/633

我想压缩所有发送到Redis的序列化对象,以减少盒子之间的网络流量。

谢谢

共有2个答案

陶高峯
2023-03-14

下面是JavaSpring Boot Redis Cluster Data配置的示例。

它是一个带有Redis群集和Redis缓存管理器的实现。

  1. 快速压缩
  2. Kryo序列化
  3. 支持每个缓存密钥的ttl
  4. Gradle配置
  5. sping-data-redis
  6. snappy-java
  7. kryo
  8. 公共资源-编解码器

链接到githubhttps://github.com/cboursinos/java-spring-redis-compression-snappy-kryo

诸福
2023-03-14

我最终以以下方式解决了它。

  1. 创建一个springbean模板。这允许我们设置自定义序列化程序
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        // Set a custom serializer that will compress/decompress data to/from redis
        RedisSerializerGzip serializerGzip = new RedisSerializerGzip();
        template.setValueSerializer(serializerGzip);
        template.setHashValueSerializer(serializerGzip);
        return template;
    }
public class RedisSerializerGzip extends JdkSerializationRedisSerializer {

    @Override
    public Object deserialize(byte[] bytes) {
        return super.deserialize(decompress(bytes));
    }

    @Override
    public byte[] serialize(Object object) {
        return compress(super.serialize(object));
    }


    ////////////////////////
    // Helpers
    ////////////////////////
    private byte[] compress(byte[] content) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) {
            gzipOutputStream.write(content);
        } catch (IOException e) {
            throw new SerializationException("Unable to compress data", e);
        }
        return byteArrayOutputStream.toByteArray();
    }

    private byte[] decompress(byte[] contentBytes) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            IOUtils.copy(new GZIPInputStream(new ByteArrayInputStream(contentBytes)), out);
        } catch (IOException e) {
            throw new SerializationException("Unable to decompress data", e);
        }
        return out.toByteArray();
    }

}
 类似资料:
  • 目前,我学习如何使用SpringBoot和访问多个数据库。在学习过程中,我遇到了向mysql表添加数据的问题。在我使用插入。。。。Value()要添加数据,当我使用get方法(SpringBoot)在网站上查找(显示)数据时,表仍然显示为null(无数据)。你们能就我的错误给我一些建议吗。 额外信息:我把mysql表放在SpringBoot的资源文件夹中。当我使用get方法(Springboot的

  • 当我将下面的依赖项添加到pom.xml时 以下错误来了 2018-05-31 12:02:38.217信息1416---[ost-startStop-1]j.LocalContainerEntityManagerFactoryBean:为持久化单元“默认”初始化JPA EntityManager工厂2018-05-31 12:01:39.233错误1416---[ost-startStop.1]o

  • 问题内容: 我想向Firebase身份验证添加新数据,其中包含显示名称,电话号码,图像之类的数据。但是我想增加更多这样的性别,生日等等。是否可以添加新的? 问题答案: 无法将任意其他数据添加到Firebase身份验证用户配置文件。如果需要,请考虑使用Firebase Realtime数据库(或CloudFirestore)存储其他信息。 自几周前以来,您可以向Firebase身份验证用户配置文件中

  • 我想添加一个新的数据到firebase认证,它有像displayname,电话号码,图像的数据。但我想增加更多这样的性别,生日和更多。有可能添加新的吗?

  • 我试过了 但这行不通。在我最初的方法中,我通过将每周编号1-4的dataframe与我的rawdata文件合并来解决这个问题。这样,我每篇文章有4周的时间(行),但是使用for循环的实现效率非常低,所以我试图用dplyr(或任何其他更高效的包/函数)做同样的事情。任何建议都将不胜感激!

  • 问题内容: 在使用AJAX调用的Web应用程序中,我需要提交一个请求,但要在URL的末尾添加一个参数, 寻找一种JavaScript函数,该函数解析URL并查看每个参数,然后添加新参数或更新值(如果已经存在)。 问题答案: 您需要调整的基本实现如下所示: 这大约是正则表达式或基于搜索的解决方案的两倍,但是这完全取决于查询字符串的长度和任何匹配项的索引 我为完成测试而基准的慢速正则表达式方法(慢了大