SpringDataRedis入门和序列化方式解决内存占用问题小结

下面就是关于“SpringDataRedis入门和序列化方式解决内存占用问题小结”的完整攻略。

SpringDataRedis入门

什么是Redis?

Redis(Remote Dictionary Server)是一个开源的基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)等。

SpringDataRedis是什么?

SpringDataRedis是Spring Data项目的一部分,它提供了与Redis集成的API。

使用SpringDataRedis

使用SpringDataRedis需要引入相关的依赖包,以下是常用的依赖包:

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.4.1</version>
    </dependency>
</dependencies>

使用SpringDataRedis需要进行配置,以下是一个简单的配置文件示例:

@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 设置key和value的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30));

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
}

在RedisConfig中,我们使用了@Bean注解来创建RedisTemplate和CacheManager对象。在RedisTemplate创建过程中,我们设置了key和value的序列化方式。通常情况下,我们可以使用默认的StringRedisSerializer来序列化key,使用Jackson2JsonRedisSerializer来序列化value。在CacheManager创建过程中,我们设置了默认的缓存时间为30分钟。

使用SpringDataRedis操作Redis通常使用以下两个类之一:RedisTemplate和StringRedisTemplate。前者可以操作任意类型的数据,后者可以操作字符串类型的数据。

以下是使用RedisTemplate来操作Redis的两个示例:

@Component
public class RedisService {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}
@SpringBootTest
public class RedisServiceTest {

    @Autowired
    private RedisService redisService;

    @Test
    public void testSetAndGet() {
        String key = "testKey";
        String value = "testValue";
        redisService.set(key, value);
        Object result = redisService.get(key);
        Assert.assertEquals(value, result);
    }
}

序列化方式解决内存占用问题

在使用Redis时,我们通常会遇到内存占用问题,这时我们可以通过设置合适的序列化方式来解决。

什么是序列化?

序列化(Serialization)是将对象转换为字节流的过程,反序列化(Deserialization)则是将字节流转换为对象的过程。在Java中,使用序列化可以将对象保存到文件中或通过网络传输。

常见的序列化方式

Java默认的序列化方式

Java默认的序列化方式是使用Java原生的ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化。虽然这种方式使用简单,但是序列化后的对象占用空间大,序列化性能相对较慢。

JSON格式序列化

JSON格式序列化是指将对象序列化为JSON格式的字符串,反序列化则是将JSON格式字符串反序列化为对象。相对于Java默认的序列化方式,JSON格式序列化序列化后的对象占用空间更小,且序列化性能更快。SpringDataRedis默认使用的就是Jackson2JsonRedisSerializer。

以下是使用Jackson2JsonRedisSerializer的示例:

@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class)));

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
}

在上面的示例中,我们将key序列化为Redis原生的字符串类型,将value序列化为Jackson2JsonRedisSerializer,可以支持所有类型的对象序列化。

Protobuf序列化

Protobuf是Google开发的一种轻量级高效的序列化框架,可以将对象序列化为一个字节数组。相对于Java默认的序列化方式和JSON格式序列化,Protobuf序列化后的对象占用空间更小,序列化性能更快。

以下是使用Protobuf序列化的示例:

public class ProtobufSerializer<T> implements RedisSerializer<T> {
    private final Protobuf.Schema<T> schema;

    public ProtobufSerializer(Protobuf.Schema<T> schema) {
        this.schema = schema;
    }

    public byte[] serialize(T t) {
        if (t == null) {
            return null;
        }

        return ProtobufIOUtil.toByteArray(t, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
    }

    public T deserialize(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }

        T t = schema.newMessage();
        ProtobufIOUtil.mergeFrom(bytes, t, schema);
        return t;
    }
}
@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new ProtobufSerializer<>(User.getSchema()));

        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(30))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new ProtobufSerializer<>(User.getSchema())));

        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }
}

在上面的示例中,我们自定义了一个ProtobufSerializer来序列化对象,需要传入Protobuf.Schema对象来指定对象类型。

示例

以下是使用各种序列化方式的示例:

@SpringBootTest
public class RedisServiceTest {

    @Autowired
    private RedisService redisService;

    @Test
    public void testSetAndGet() {
        // 使用Java默认的序列化方式
        User user = new User(1L, "Tom");
        redisService.set("user1", user);
        User result1 = (User) redisService.get("user1");
        Assert.assertEquals(user.getId(), result1.getId());
        Assert.assertEquals(user.getName(), result1.getName());

        // 使用JSON格式序列化
        redisService.set("user2", user, Duration.ofMinutes(10));
        User result2 = (User) redisService.get("user2");
        Assert.assertEquals(user.getId(), result2.getId());
        Assert.assertEquals(user.getName(), result2.getName());

        // 使用Protobuf序列化
        redisService.set("user3", user, Duration.ofMinutes(10));
        User result3 = (User) redisService.get("user3");
        Assert.assertEquals(user.getId(), result3.getId());
        Assert.assertEquals(user.getName(), result3.getName());
    }
}

在上面的示例中,我们创建了一个User对象,分别使用Java默认的序列化方式、JSON格式序列化和Protobuf序列化。可以看到,三种序列化方式都能正确地将对象序列化和反序列化。另外,使用JSON格式序列化和Protobuf序列化时,序列化后的对象占用空间明显更小。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringDataRedis入门和序列化方式解决内存占用问题小结 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • JavaWeb登陆功能实现代码

    下面是“JavaWeb登录功能实现代码”的完整攻略: 1.准备工作 要实现登录功能,需要如下准备工作: 开发工具:建议使用Eclipse或IDEA等JavaWeb开发工具 数据库:建议使用MySQL等关系型数据库 服务器:Tomcat等JavaWeb服务器 2.创建用户表 登录需要依赖用户表,因此需要创建用户表。可以使用如下SQL语句创建一个简单的用户表: …

    Java 2023年5月19日
    00
  • SpringBoot中支持Https协议的实现

    SpringBoot是一个非常流行的Java开发框架,支持各种协议,如Http、Https等。本篇攻略将详细讲解SpringBoot中支持Https协议的实现方法。 准备工作 在SpringBoot中支持Https协议,需要准备三个文件: SSL证书文件(如:keystore.jks或server.crt) SSL证书密码(如:123456) 修改appli…

    Java 2023年5月20日
    00
  • Java Servlet生成JSON格式数据并用jQuery显示的方法

    下面是 Java Servlet 生成 JSON 格式数据并用 jQuery 显示的方法的完整攻略。 什么是 JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写。 Servlet 生成 JSON 1. 添加依赖 首先需要添加一个 JSON 库,常用的有 Gson 和 FastJSON。这里…

    Java 2023年5月26日
    00
  • 如何防止Java安全漏洞?

    如何防止Java安全漏洞? Java是一种广泛应用的编程语言,然而由于其代码的可移植性和易读性,Java安全漏洞也越来越普遍。有一些预防Java安全漏洞的最佳做法,包括以下步骤: 及时更新Java版本和补丁 Java的开发者经常会发布新版本或补丁,以修复安全漏洞和其他错误。建议及时更新Java版本,并安装最新的安全补丁。这样可以最大程度的减少Java程序受到…

    Java 2023年5月11日
    00
  • Spring Boot实现简单的增删改查

    下面是SpringBoot实现简单的增删改查的完整攻略。 1. 环境准备 在开始之前,需要找到一台安装了JDK1.8以上版本的电脑,并确保你已经熟练掌握了Java语言以及Spring Boot框架的基础知识。 首先,需要安装开发工具IDEA和Maven。 在IDEA官网下载并安装IntelliJ IDEA Community版本:https://www.je…

    Java 2023年5月15日
    00
  • Java中实现Comparator接口和用法实例(简明易懂)

    Java中实现Comparator接口和用法实例(简明易懂) 什么是Comparator接口 在Java中,Comparator接口是一个函数式接口,它定义了两个对象之间比较的方法,以便根据指定的属性对对象进行排序。与Comparable接口类似,但是它可以实现对任何对象的排序。 实现Comparator接口 要实现Comparator接口,您需要执行以下步…

    Java 2023年5月19日
    00
  • Java刷视频浏览量点赞量的实现代码

    为了实现Java刷视频浏览量和点赞量,需要进行如下步骤: 1. 获取视频链接 首先需要获取视频的地址。这可以通过抓包工具来获取,或者通过视频网站提供的API来获取。比如,在B站网站中,可以使用下面的API获取某一个视频的详细信息: https://api.bilibili.com/x/web-interface/view?aid={aid} 其中{aid}是…

    Java 2023年6月16日
    00
  • Java基数排序radix sort原理及用法解析

    Java基数排序(radix sort)原理及用法解析 简介 基数排序(radix sort)是一种线性时间非比较排序算法。该算法按照元素的每个位数进行排序。 对于待排序的整数集合,基数排序将集合中的元素按照它们的个位、十位、百位……的大小排序(可以理解为在固定位数的情况下逐个进行桶排序)。 基数排序的时间复杂度为 $O(d \cdot (n+k))$,其中…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部